• 締切済み

[C#] DeviceIoControlの変数の型

Visual C# 2008でDeviceIoControlを利用して USBを操作しようとしているのですが、 DLLImportの時に指定する変数の型がわからないのです。 BOOL DeviceIoControl( HANDLE hDevice, // デバイス、ファイル、ディレクトリいずれかのハンドル DWORD dwIoControlCode, // 実行する動作の制御コード LPVOID lpInBuffer, // 入力データを供給するバッファへのポインタ DWORD nInBufferSize, // 入力バッファのバイト単位のサイズ LPVOID lpOutBuffer, // 出力データを受け取るバッファへのポインタ DWORD nOutBufferSize, // 出力バッファのバイト単位のサイズ LPDWORD lpBytesReturned, // バイト数を受け取る変数へのポインタ LPOVERLAPPED lpOverlapped // 非同期動作を表す構造体へのポインタ ); と、MSDNに載っていて [DllImport("kernel32", SetLastError = true)] private static extern bool DeviceIoControl( IntPtr hDevice, // デバイス、ファイル、ディレクトリいずれかのハンドル uint dwIoControlCode, // 実行する動作の制御コード ref byte[] lpInBuffer, uint nInBufferSize, // 入力バッファのバイト単位のサイズ ref byte[] lpOutBuffer, uint nOutBufferSize, // 出力バッファのバイト単位のサイズ ref int lpBytesReturned, // バイト数を受け取る変数へのポインタ int Overlapped // overlapped buffer ); と、して Bool ret = DeviceIoControl(hDevice,123456,null,0,null,0,0); と、しても戻り値がfalseにしかなりません。 具体的には byte配列で{ 0x01, 0x23, 0x45, 0x67, 0,89}のような値を入力データにして byte bytes = new byte[10]; で、確保したbytesに出力データを受け取りたいのです。 どのようにすればよいでしょうか?

みんなの回答

回答No.1

APIのBOOL型をbool型にマーシャルする場合は,明示的に指定する必要があります。 つまり, [return: MarshalAs(UnmanagedType.Bool)] という属性がDeviceIoControlに必要です。 あとは,Marshal.GetLastWin32Errorでエラーコードを取得して調べていくしか……。

knoppixer
質問者

補足

ありがとうございます。 下のようにやってみたのですが、errorの値は 87(パラメータが正しくありません)となってしまいます。 入力データは全て0x00で4バイト分、 出力のバッファは10バイトでDeviceIoControlを呼び足したいのですが・・・ hDeviceの取得は失敗しておらず、 byte[] Buf = null int abc = 0; DeviceIoControl(hDevice, 2236465, ref Buf, 0, ref Buf, 0, ref abc, 0) とした時は、GetLastError()で取得した値が0で成功していました。 どこのパラメータが不正なのでしょうか? [DllImport("kernel32", SetLastError = true)] private static extern bool DeviceIoControl( IntPtr hDevice, // デバイス、ファイル、ディレクトリいずれかのハンドル uint dwIoControlCode, // 実行する動作の制御コード ref byte[] lpInBuffer, uint nInBufferSize, // 入力バッファのバイト単位のサイズ ref byte[] lpOutBuffer, uint nOutBufferSize, // 出力バッファのバイト単位のサイズ ref int lpBytesReturned, // バイト数を受け取る変数へのポインタ int Overlapped // overlapped buffer ); RetData = new byte[10]; SendData = new byte[4]; int test = 0; DeviceIoControl(hDevice, 2236497, ref SendData, 4, ref RetData, 10, ref test, 0); int error = Marshal.GetLastWin32Error();

関連するQ&A