1

私はWindowsプログラミングだけでなくC#にもかなり慣れていないため、USB HIDデバイスとWindows XP PC上のC#で記述されたアプリとの間の通信を確立しようとしています。デバイス パスを正常に取得し、これを使用してデバイスで有効なハンドルを確立しました。

IntPtr drive = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE,
               FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero,
               OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, IntPtr.Zero);

これは、テスト時に正の整数を生成する有効なハンドルであることが証明されました。ハンドルを作成した後、'HidD_GetPreparsedData' と 'HidP_GetCaps' を呼び出します。これにより、以前にインポートされた構造体 (HIDP_CAPS) が生成され、接続されたデバイスに関連する特定のデータが格納されます。次に、writefile() を呼び出してみます。

bool success = WriteFile(drive, ref outputReportBuffer, 
               caps.OutputReportByteLength, ref numberOfBytesWritten, 
               IntPtr.Zero); 

ドライブ: デバイスのハンドル

outputReportBuffer:書き込むバイトの配列 [65]

caps.OutputReportByteLength: 書き込むバイト数。caps は HIDP_CAPS の構造体です。

numberOfBytesWritten: 0 にハードコーディング

IntPtr.Zero: 私が読んだものはすべて、私が行ったようにこの最後のパラメーターを渡します。「writefile」の正式なパラメーターでは、最後のパラメーターは「IntPtr ipOverlapped」としてリストされていますが、それが何であるかを理解することはできませんでしたが、0 の何らかの形式として渡す必要があることを除いて

WriteFile のインポート方法:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(IntPtr hFile, 
ref byte[] lpBuffer, 
uint nNumberOfBytesToWrite,
ref uint lpNumberOfBytesWritten, 
IntPtr ipOverlapped);

writefile が実行されると、単に何もしません。エラーは発生しませんが、テストすると、通信が確立されておらず、成功していないことがわかります。誰かが知識を共有したり、役立つリソースを提供したりできれば、本当に感謝しています。読んでくれてありがとう。

よろしく。

4

1 に答える 1

0

宣言から を削除refします。WriteFile

http://www.pinvoke.net/は P/Invoke 宣言の優れたリソースですが、これは wiki スタイルの Web サイトであり、多くの宣言が間違っています (多くの場合、x64 マシンでは機能しません)。

于 2012-07-27T16:45:45.773 に答える