.NET コンパクト フレームワークは初めてです。DeviceIoControl 関数を呼び出し、構造体を入出力パラメーターとして IOControl 関数に渡す必要があります。
PInvoke/DeviceIoControlで、関数自体にアクセスする方法を見つけました。しかし、どうすればポインタを構造体InBuf
とOutBuf
パラメータとして渡すことができますか?
DeviceIoControl は P/Invoke として定義されています。
[DllImport("coredll", EntryPoint = "DeviceIoControl", SetLastError = true)]
internal static extern int DeviceIoControlCE(
int hDevice, int dwIoControlCode,
byte[] lpInBuffer, int nInBufferSize,
byte[] lpOutBuffer, int nOutBufferSize,
ref int lpBytesReturned, IntPtr lpOverlapped);
問題の構造のレイアウトは次のとおりです。
struct Query
{
int a;
int b;
char x[8];
}
struct Response
{
int result;
uint32 success;
}
void DoIoControl ()
{
Query q = new Query();
Response r = new Response();
int inSize = System.Runtime.InteropServices.Marshal.SizeOf(q);
int outSize = System.Runtime.InteropServices.Marshal.SizeOf(r);
NativeMethods.DeviceIoControlCE((int)handle, (int)IOCTL_MY.CODE,
ref q, inSize, ref r, outSize, ref bytesReturned, IntPtr.Zero);
}
編集:このコードをコンパイルしようとすると、エラーが発生します:
cannot convert from 'ref MyNamespace.Response' to 'byte[]'
構造体参照の代わりにバイトへのポインターを期待する DeviceIoControl 関数に構造体のアドレスを渡すにはどうすればよいですか?