2010-01-15 4 views
2

У меня есть dll для класса C++ (SLABHIDDevice.dll). Я пытаюсь использовать функции этой DLL в приложении C# .net. Длл содержит несколько методов, которые я могу использовать легко с такими заявлениями, как это ...Использование DLLImport для импорта объекта

(I appolagize, если я получаю некоторые термины неправильно здесь я новичок с использованием библиотек 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?

Это маска из dll из DUMPBIN ... Нижние три функции - единственные, с которыми я могу работать? Кто-нибудь знает, какой синтаксис мне нужно использовать, чтобы получить другие? Что означают значки вопроса, предшествующие именам функций?

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 [email protected]@[email protected]@@Z 
      5 1 00001330 [email protected]@[email protected] 
      6 2 00001430 [email protected]@[email protected] 
      7 3 00001080 [email protected]@[email protected]@@Z 
      8 4 00020044 [email protected]@[email protected] 
      9 5 00001460 [email protected]@@QAEEXZ 
     10 6 00001C70 [email protected]@@QAEHXZ 
     11 7 00001CA0 [email protected]@@QAEGXZ 
     12 8 00001850 [email protected]@@[email protected] 
     13 9 00001C80 [email protected]@@QAEGXZ 
     14 A 00001BE0 [email protected]@@[email protected] 
     15 B 00001A20 [email protected]@@[email protected] 
     16 C 00001CB0 [email protected]@@QAEKXZ 
     17 D 00001C90 [email protected]@@QAEGXZ 
     18 E 00001730 [email protected]@@[email protected] 
     19 F 00001CC0 [email protected]@@[email protected] 
     20 10 00001700 [email protected]@@QAEHXZ 
     21 11 000014A0 [email protected]@@[email protected] 
     22 12 00001360 [email protected]@@AAEXXZ 
     23 13 00001810 [email protected]@@[email protected] 
     24 14 00001B80 [email protected]@@[email protected] 
     25 15 000018C0 [email protected]@@[email protected] 
     26 16 00001CE0 [email protected]@@[email protected] 
      3 17 00001320 GetHidGuid 
      2 18 000GetHidString 
      1 19 00001190 GetNumHidDevices 

    Summary 

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

ответ

3

Вы не можете использовать P/Invoke для вызова методов экземпляра класса C++. Основное зависание заключается в том, что вы не можете создать объект класса, вы не можете определить необходимый размер выделения памяти. Передача неявного «этого» указателя на метод экземпляра - еще одна проблема, его нужно передать в регистр.

Вам понадобится создать управляемую оболочку для класса, для которой требуется использовать язык C++/CLI. Google «C++/CLI wrapper» для хороших ударов.

+0

Передача 'this' не является проблемой, так как существует' CallingConvention.ThisCall' (которая, по крайней мере, совместима с VC++). Необходимая сторона выделения памяти может быть определена, если заголовки доступны для DLL (и они должны быть, иначе никто не сможет использовать его из C++). –

+0

Хм, не уверен, как компилятор C# будет разбирать этот заголовок. –

1

C++ использует название mangling. Все странные символы вокруг ваших имен функций - это способ для компилятора/компоновщика знать соглашение о вызове, параметры, тип возврата и т. Д.

Если вы не хотите использовать управление именами с вашими функциями, вам нужно окружают их

extern "C" { 
} 

заявление.

См http://en.wikipedia.org/wiki/Name_mangling

Смежные вопросы