使用DLLImport导入对象 我有一个C++类的DLL(SLabIDAdvuto.dll)。我试图在C#.net应用程序中使用此dll的函数。dll包含几个方法,我可以很容易地使用这些方法来处理如下语句
(如果我这里的一些术语有误,我对此深表歉意,因为我不熟悉使用DLL) SLABHIDDevice.dll的文档说明它还包含一个类对象CHIDDevice。 这个对象有一个完整的成员函数列表,比如Open() 如果我尝试使用与上面相同的语法导入Open(),我会得到一个错误,说明它找不到Open()函数的入口点。这是因为Open()是CHIDDevice的成员吗 这是DUMPBIN中dll的组成。。。下面三个功能是我唯一可以使用的功能?有人知道我需要使用什么语法来获取其他语法吗?函数名前面的问号是什么意思使用DLLImport导入对象 我有一个C++类的DLL(SLabIDAdvuto.dll)。我试图在C#.net应用程序中使用此dll的函数。dll包含几个方法,我可以很容易地使用这些方法来处理如下语句,c#,c++,oop,dllimport,C#,C++,Oop,Dllimport,(如果我这里的一些术语有误,我对此深表歉意,因为我不熟悉使用DLL) 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
C++使用名称mangling。函数名周围的所有奇怪符号都是编译器/链接器了解调用约定、参数、返回类型等的一种方式 如果您不想在函数中使用名称混乱,则需要使用
extern "C" {
}
声明
参见不能使用p/UnjCK调用C++类的实例方法。主要的问题是无法创建类的对象,无法发现所需的内存分配大小。将隐式“this”指针传递给实例方法是另一个问题,它需要在寄存器中传递
您需要为该类创建托管包装器,这需要使用C++/CLI语言。谷歌“C++/CLI包装器”点击率很高。传递
这个不是问题,因为有调用约定。这个调用(至少与VC++兼容)。如果DLL的报头可用,则必须确定所需的内存分配侧(并且它们应该是,否则,也没有人能够从C++中使用它)。Hmm,不确定C编译器如何解析该报头。
extern "C" {
}