2

c ++クラスのdll(SLABHIDDevice.dll)があります。このdllの機能をC#.netアプリケーションで使用しようとしています。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の構成です...下の3つの関数は、私が動作させることができる唯一の関数ですか?他の構文を取得するために使用する必要のある構文を誰かが知っていますか?関数名の前にある疑問符はどういう意味ですか?

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
4

2 に答える 2

3

P/Invokeを使用してC++クラスのインスタンスメソッドを呼び出すことはできません。主な問題は、クラスのオブジェクトを作成できないこと、必要なメモリ割り当てサイズを見つけることができないことです。インスタンスメソッドに暗黙の「this」ポインタを渡すことは別の問題であり、レジスタで渡す必要があります。

クラスのマネージラッパーを作成する必要があります。これには、C ++/CLI言語を使用する必要があります。良いヒットのためのグーグル「C++/CLIラッパー」。

于 2010-01-15T14:11:24.413 に答える
1

C++は名前マングリングを使用します。関数名の周りのすべての奇妙な記号は、コンパイラー/リンカーが呼び出し規約、パラメーター、戻り型などを知るための方法です。

関数で名前マングリングを使用したくない場合は、関数をで囲む必要があります。

extern "C" {
}

声明。

http://en.wikipedia.org/wiki/Name_manglingを参照してください

于 2010-01-15T14:03:40.660 に答える