使用DLLImport导入Object

时间:2010-01-15 14:01:03

标签: c# c++ oop dllimport

我有一个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

2 个答案:

答案 0 :(得分:3)

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

您需要为该类创建托管包装器,这需要使用C ++ / CLI语言。谷歌“C ++ / CLI包装”获得好评。

答案 1 :(得分:1)

C ++使用名称修改。函数名称周围的所有奇怪符号都是编译器/链接器知道调用约定,参数,返回类型等的一种方式。

如果您不想对您的功能使用名称修改,则需要用

包围它们
extern "C" {
}

语句。

请参阅http://en.wikipedia.org/wiki/Name_mangling