2017-11-28 33 views
0

C#から関数を呼び出すには、関数を呼び出せません。関数からDokumentationある :C++のDLLから関数を呼び出す#

ボイドWINAPIのEnumerateHidDevices(PVOID pContext、ENUM_HID_PROCコールバック)。

機能説明: システム内のすべてのEETI PCAP HIDタッチデバイスを列挙します。

パラメータ:

pContext:用意したメモリを呼び出し側にポインタポイント。このアドレスはコールバックルーチンに渡されます。

コールバック:コールバックはコールバックルーチンを準備しました。このコールバックルーチンは、APIがPCAPタッチデバイスを列挙するたびに呼び出されます。

ENUM_HID_PROC:デバイス列挙コールバックルーチンのプロトタイプ。

typedef BOOL(WINAPI * ENUM_HID_PROC)(PVOID pContext、LPCTSTR szSymbolicName、LPCTSTR szProduct、ULONG ulInLength、ULONG ulOutLength);

pContext:コールバックルーチン用の呼び出し側準備バッファへのポインタ。

szSymbolicName:デバイス記号のリンクデバイスの列挙子の名前を列挙します。この文字列は、OpenHIDDeviceでデバイスを開くために使用する必要があります。

szProduct:ulInLength

製品名を指定します:バイト単位で入力レポートの最大サイズ。 OpenHIDDeviceを使用してデバイスを開くには、このパラメータを使用する必要があります。

ulOutLength: 出力レポートの最大サイズ(バイト単位)。 OpenHIDDeviceを使用してデバイスを開くには、このパラメータを使用する必要があります。

そして、その

方法をC#で、現時点でその表情:

public HID_DEVICE_INFO m_HIDDevInfo = new HID_DEVICE_INFO(); 
    public struct HID_DEVICE_INFO 
    { 
     public string strDeviceName; 
     public uint m_ulInLength; 
     public uint m_ulOutLength; 
     public ushort m_VID; 
     public ushort m_PID; 
    } 

    public delegate int ENUM_HID_PROC(object pContext, string szSymbolicName, string szProduct, uint ulInLength, uint ulOutLength); 

    [DllImport("HIDdAPI.dll")] 
    public static extern void EnumerateHidDevices(object pContext, ENUM_HID_PROC Callback); 

    public MainView1() 
    { 
     InitializeComponent(); 
     EnumerateHidDevices(m_HIDDevInfo, EnumUsbHidCallback); 
    } 

    public static int EnumUsbHidCallback(object pContext, string szDeviceName, string szProduct, uint ulInLength, uint ulOutLength) 
    { 
     HID_DEVICE_INFO pInfo = (HID_DEVICE_INFO)pContext; 

     pInfo.strDeviceName = szDeviceName; 
     Console.Write("\r\n"); 
     Console.Write("Enumerate EETI HID Device: {0}\r\n", pInfo.strDeviceName); 
     Console.Write("\r\n"); 
     pInfo.m_ulInLength = ulInLength; 
     pInfo.m_ulOutLength = ulOutLength; 

     return 1; 
    } 

これはEnumerateHidDevices(m_HIDDevInfo、EnumUsbHidCallback)でArgumentExceptionがで終わる:

発生System.ArgumentExceptionの

HResult = -2147024809

メッセージ=値が予想される範囲内にありません。 = mscorlib

のStackTrace

出典:システムで 。StubHelpers.ObjectMarshaler.ConvertToNative(オブジェクトobjSrc、のIntPtr pDstVariant) のInnerException:

問題がありますか?

ありがとうございました。

+0

デフォルト値をチェックすることもできます。 –

+0

こんにちはジャック、私はデフォルト値を追加しましたが、EnumerateHidDevices(m_HIDDevInfo、EnumUsbHidCallback)でも同じArgumentExceptionがあります。 –

+0

呼び出し規約を設定していません –

答えて

0

あなたのコードは危険です。あなたのスニペットのどこにでもあなたのオブジェクトを固定することがわかりません。あなたが望むことを行う正しい方法は、IntPtrをメソッドに渡し、structへのポインタをMarshal.StructureToPtrで得ることです。

また)(公共HID_DEVICE_INFO m_HIDDevInfo =新しいHID_DEVICE_INFOためthis question.

関連する問題