
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件)
- 最新から表示
- 回答順に表示
No.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();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
[C#] DeviceIoControlの変数の型
-
変換
-
init関数の意味
-
構造体の初期化のmemsetの第三引数
-
ポインタのミスでOS壊れるの...
-
プーさんのマウスポインタを教...
-
fopne で失敗する原因
-
構造体を値で渡す良い点はあり...
-
VC++6.0 MFC ダイアログバーを...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
newとdeleteでのアサート
-
戻り値で構造体を返すことは可...
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C# Listを使わずに2次元配列の...
-
配列の要素数に変数を入れたい...
-
関数から配列を返すには?
-
newしないオブジェクトについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報