gpt4 book ai didi

c# - 使用 DLLImport 导入对象

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:05 25 4
gpt4 key购买 nike

我有一个 C++ 类的 dll (SLABHIDDevice.dll)。我正在尝试在 C#.net 应用程序中使用此 dll 的功能。该 dll 包含几个方法,我可以很容易地使用这些方法,例如这样的语句......

(如果我在这里弄错了一些术语,我很抱歉我是 dll 的新手)

[DllImport("SLABHIDDevice.dll")]
public static extern byte GetHidString
(Int32 deviceIndex, Int32 vid, Int32 pid,
Byte hidStringType, String deviceString,
Int32 deviceStringLength);

SLABHIDDevice.dll 的文档说它还包含一个类对象 CHIDDevice。并且该对象具有完整的成员函数列表,例如 Open();

如果我尝试使用与上述相同的语法导入 Open(),我会收到一条错误消息,指出它找不到 Open() 函数的入口点。这是因为 Open() 是 CHIDDevice 的成员吗?

这是来自 DUMPBIN 的 dll 的构造...底部的三个函数是我唯一能够开始工作的函数吗?有谁知道我需要使用什么语法来获取其他语法?函数名称前的问号是什么意思?

Dump of file SLABHIDDEVICE.dll

File Type: DLL

Section contains the following exports for SLABHIDDevice.dll

00000000 characteristics
47E13E0F time date stamp Wed Mar 19 12:23:43 2008
0.00 version
1 ordinal base
26 number of functions
26 number of names

ordinal hint RVA name

4 0 00001000 ??0CHIDDevice@@QAE@ABV0@@Z
5 1 00001330 ??0CHIDDevice@@QAE@XZ
6 2 00001430 ??1CHIDDevice@@UAE@XZ
7 3 00001080 ??4CHIDDevice@@QAEAAV0@ABV0@@Z
8 4 00020044 ??_7CHIDDevice@@6B@
9 5 00001460 ?Close@CHIDDevice@@QAEEXZ
10 6 00001C70 ?FlushBuffers@CHIDDevice@@QAEHXZ
11 7 00001CA0 ?GetFeatureReportBufferLength@CHIDDevice@@QAEGXZ
12 8 00001850 ?GetFeatureReport_Control@CHIDDevice@@QAEEPAEK@Z
13 9 00001C80 ?GetInputReportBufferLength@CHIDDevice@@QAEGXZ
14 A 00001BE0 ?GetInputReport_Control@CHIDDevice@@QAEEPAEK@Z
15 B 00001A20 ?GetInputReport_Interrupt@CHIDDevice@@QAEEPAEKGPAK@Z
16 C 00001CB0 ?GetMaxReportRequest@CHIDDevice@@QAEKXZ
17 D 00001C90 ?GetOutputReportBufferLength@CHIDDevice@@QAEGXZ
18 E 00001730 ?GetString@CHIDDevice@@QAEEEPADK@Z
19 F 00001CC0 ?GetTimeouts@CHIDDevice@@QAEXPAI0@Z
20 10 00001700 ?IsOpened@CHIDDevice@@QAEHXZ
21 11 000014A0 ?Open@CHIDDevice@@QAEEKGGG@Z
22 12 00001360 ?ResetDeviceData@CHIDDevice@@AAEXXZ
23 13 00001810 ?SetFeatureReport_Control@CHIDDevice@@QAEEPAEK@Z
24 14 00001B80 ?SetOutputReport_Control@CHIDDevice@@QAEEPAEK@Z
25 15 000018C0 ?SetOutputReport_Interrupt@CHIDDevice@@QAEEPAEK@Z
26 16 00001CE0 ?SetTimeouts@CHIDDevice@@QAEXII@Z
3 17 00001320 GetHidGuid
2 18 00001230 GetHidString
1 19 00001190 GetNumHidDevices

Summary

6000 .data
7000 .rdata
5000 .reloc
4000 .rsrc
1C000 .text

最佳答案

您不能使用 P/Invoke 调用 C++ 类的实例方法。主要问题是您无法创建该类的对象,您无法发现所需的内存分配大小。将隐式“this”指针传递给实例方法是另一个问题,它需要在寄存器中传递。

您需要为该类创建一个托管包装器,这需要使用 C++/CLI 语言。 Google“C++/CLI 包装器”以获得良好的命中率。

关于c# - 使用 DLLImport 导入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2071993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com