32ビットC#アプリケーションからのwParamが64ビットC++プロセスに移行する途中で変更されたため、ポインタの内容に問題があります。32ビットC#から64ビットC++へのPostMessageパラメータ
32.exe(C#)と64.exe(C++)の2つのプロセスがあります。 64.exeは、32.exeの子プロセスとして起動されます。 64.exeの32.exeポストウィンドウメッセージ。そのうち1つにwParamがあり、これはRECT構造体の配列へのポインタです。 64.exeと32.exeには共通のDLL(C++で書かれていますが、もちろん異なるプラットフォーム用にコンパイルされています)があり、32.dllと64.dllと呼ばれています。
32.dllでRECT *を期待する関数は、後で掲載される同じRECT *で32.exeから直接呼び出され、これはうまくいきます。私が検証されてきたデバッグでは
if (Is64Bit() && SubProcess64 != null)
{
Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
(uint)pointer.ToInt32(), length);
}
MessageBox.Show(pointer.ToString());
DLL32.SetDisabledAreas(pointer, length);
:
else if (WM_SetDisabledAreas == message)
{
SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}
メッセージが掲載されて次のようにその後は、同じ関数を呼び出し、* RECTするのwParamをキャスト64.exeするメッセージを、ポストメッセージは受信されますが、wParamアドレスは前と同じではありません。これは予想外のことではありませんが、現在指しているメモリの内容は定義されていません(何があるかを見てみるとアクセス違反が発生します)。
ここで何が起こっているか
ポインタ変数の初期化方法を含むソースを追加できますか? – Jason
正確にこの質問のような:http://stackoverflow.com/questions/1086294/convert-array-of-structs-to-intptr –
SendMessageを使用する場合、問題が発生しますか? – Jason