我有一个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
答案 0 :(得分:3)
您不能使用P / Invoke来调用C ++类的实例方法。主要的挂起是你无法创建类的对象,你无法发现所需的内存分配大小。将隐式“this”指针传递给实例方法是另一个问题,需要在寄存器中传递。
您需要为该类创建托管包装器,这需要使用C ++ / CLI语言。谷歌“C ++ / CLI包装”获得好评。
答案 1 :(得分:1)
C ++使用名称修改。函数名称周围的所有奇怪符号都是编译器/链接器知道调用约定,参数,返回类型等的一种方式。
如果您不想对您的功能使用名称修改,则需要用
包围它们extern "C" {
}
语句。