dポイントプレゼントキャンペーン実施中!

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に出力データを受け取りたいのです。

どのようにすればよいでしょうか?

A 回答 (1件)

APIのBOOL型をbool型にマーシャルする場合は,明示的に指定する必要があります。


つまり,
[return: MarshalAs(UnmanagedType.Bool)]
という属性がDeviceIoControlに必要です。

あとは,Marshal.GetLastWin32Errorでエラーコードを取得して調べていくしか……。

この回答への補足

ありがとうございます。
下のようにやってみたのですが、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();

補足日時:2008/02/16 17:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!