RECT構造体の配列をIntPtrに変換しようとしています。そのため、PostMessageを使用して別のアプリケーションにポインタを送信できます。構造体の配列をIntPtrに変換する
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
// lots of functions snipped here
}
// so we have something to send, in reality I have real data here
// also, the length of the array is not constant
RECT[] foo = new RECT[4];
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(foo[0]) * 4);
Marshal.StructureToPtr(foo, ptr, true); // -- FAILS
これが最後の行(「指定された構造は、blittable型であるか、レイアウト情報を持っていなければなりません。」)にArgumentExceptionがを与えます。私は何とかこの配列のRECTをPostMessageを使って別のアプリケーションに渡す必要があるので、本当にこのデータへのポインタが必要です。
ここには何がありますか?
UPDATE:これは動作するようです:
IntPtr result = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32.RECT)) * foo.Length);
IntPtr c = new IntPtr(result.ToInt32());
for (i = 0; i < foo.Length; i++)
{
Marshal.StructureToPtr(foo[i], c, true);
c = new IntPtr(c.ToInt32() + Marshal.SizeOf(typeof(Win32.RECT)));
}
がアービタにコメントして修正しAGAINを更新しました。
自動的4 RECTSの配列のクロスプロセスマーシャリングを行うことは何のメッセージを投稿していますか? –
画面の特定の領域を無視するDLL(64ビットであるため、別のプロセスでホストされている)に伝えようとしています。必ずしも4つのRECTであるとは限りません。 –
更新プログラムに応じて、十分な領域(Marshal.SizeOf(typeof(RECT))ではなくintptr.size)を割り当てないでください。そして、x64マシンでポインタ演算が失敗することがあります。私の答えを見てください。 – arbiter