32 ビット C# アプリケーションからの wParam が 64 ビット C++ プロセスに途中で変更されているときに渡されるポインターの内容に問題があります。
32.exe (C#) と 64.exe (C++) の 2 つのプロセスがあります。64.exe は 32.exe の子プロセスとして起動されます。32.exe は 64.exe のウィンドウ メッセージをポストします。そのうちの 1 つには、RECT 構造体の配列へのポインターである wParam があります。64.exe と 32.exe の両方に、32.dll と 64.dll という共通の DLL (C++ で記述されていますが、もちろん異なるプラットフォーム用にコンパイルされています) があります。
32.dll で RECT* を期待する関数は、後でポストされる同じ RECT* を使用して 32.exe から直接呼び出され、これはうまく機能します。その後、同じ関数を呼び出して wParam を RECT* にキャストする 64.exe にメッセージを投稿します。
else if (WM_SetDisabledAreas == message)
{
SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}
メッセージは次のように投稿されます。
if (Is64Bit() && SubProcess64 != null)
{
Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
(uint)pointer.ToInt32(), length);
}
MessageBox.Show(pointer.ToString());
DLL32.SetDisabledAreas(pointer, length);
デバッグにより、メッセージが受信されたことを確認しましたが、wParam アドレスは以前と同じではありません。これは予期しないことではありませんが、現在ポイントしているメモリの内容は定義されていません (そこにあるものを確認しようとすると、アクセス違反が発生します)。
ここで何が起きてるの?