メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 題名: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: おじさんプログラマ
- 日時: 2012/05/18 23:06:07
- ID: 30459
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: Azulean
- 日時: 2012/05/19 9:27:22
- ID: 30460
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: shu
- 日時: 2012/05/19 21:43:32
- ID: 30461
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: おじさんプログラマ
- 日時: 2012/05/19 22:17:46
- ID: 30463
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: おじさんプログラマ
- 日時: 2012/05/19 22:19:45
- ID: 30464
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: Azulean
- 日時: 2012/05/19 23:33:44
- ID: 30465
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: メンバにポインタを持つ構造体へのポインタをパラメータとするアンマネージDLL呼出し
- 著者: おじさんプログラマ
- 日時: 2012/05/20 8:20:00
- ID: 30466
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
ポインタを含む構造体をパラメータとするアンマネージDLLをC#から使用したい
のですがうまくいかずに困っています。
どなたか、不備をご指摘願えませんでしょうか。宜しくお願い致します。
あるメーカ作成のアンマネージDLLで、Visual C/C++からのデータ読出しの関数
仕様として、以下のような呼出しを定義されています。
[読出し]
WORD Read(WORD, A_READ*);
[構造体定義]
typedef struct tag_A_READ
{
WORD wNumber;
DWORD dwDataBufferLength; /* データを格納する領域の長さ */
LPBYTE lpbDataBuffer; /* データを格納する領域のポインタ */
} A_READ;
これを先人が作成したDelphi6の以下のようなソースでアクセスすると、
データバッファにはデータを読み出すことができます。
[レコード定義]
PA_READ = ^TA_READ;
TA_READ = packed record
wNumber : Word;
dwDataBufferLength : DWORD; // Buffer length (Number of BYTE)
lpbDataBuffer : ^Byte; // Data buffer pointer
end;
[読出しバッファ定義]
var
A_Data: array[0..1023] of Word;
[読出し]
procedure ADataRead;
var
AREAD: TA_READ;
begin
with AREAD do
begin
wNumber := 1;
dwDataBufferLength := SizeOf(A_Data);
lpbDataBuffer := @A_Data;
end;
if Read(5, @AREAD) <> 1 then
begin
MessageBox(0, Read_Error, nil, mb_OK);
Halt;
end;
end;
Delphiには明るくないのですが、DLLに問題がないことを証明していると
考えています。
今回C#にて書き換えを試みているのですが、以下のようにC#コードを書くと
読出し関数から返ってこず最悪はブルースクリーンとなります。
[構造体定義]
unsafe public struct A_READ
{
public ushort wNumber;
public uint dwDataBufferLength;
public byte* lpbDataBuffer;
}
[読出しバッファ定義]
unsafe public byte[] a_data = new byte[2048];
[読出しメソッド]
void DataRead
{
fixed (byte* bp = &a_data[0])
{
read.wTransferLineNumber = 1;
read.dwDataBufferLength = 2048;
read.lpbDataBuffer = bp;
ret = Read(5, ref read);
}
}
現象からして、アンマネージコードでのメモリ破壊が起こっているように思い
ます。
a_data[0]に何か値を入れると、デバッガ上ではlpbDataBufferにはその値を読む
ことができるので、ポインタは期待通り渡せていると思うのですが、DLL内で異常
なアドレスへの書き込みが起こるためにブルースクリーンになる等の不安定動作
となっていると考えています。
上記C#コードのどこに不備があるのか、どなたかご指摘願えませんでしょうか。