2009-07-06 17 views
2

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アドレスは前と同じではありません。これは予想外のことではありませんが、現在指しているメモリの内容は定義されていません(何があるかを見てみるとアクセス違反が発生します)。

ここで何が起こっているか

+0

ポインタ変数の初期化方法を含むソースを追加できますか? – Jason

+0

正確にこの質問のような:http://stackoverflow.com/questions/1086294/convert-array-of-structs-to-intptr –

+0

SendMessageを使用する場合、問題が発生しますか? – Jason

答えて

5

それぞれ2つのプロセスには独自のアドレス空間があり、プロセス32.exeからのポインタは64.exeでは無効です。

しかし、これは32bitと64bitとはまったく関係ありません。 2つのプロセス間でデータを転送するには、選択したプロセス間通信技術を使用するだけです。

たとえば、CreateFileMappingを使用すると、共有メモリの名前付きセクションを作成できます。

+0

私は彼らが異なるアドレス空間を持つことができることを知っていますが、あなたがポインタを渡すときにこれを翻訳するWindowsではありませんか? –

+0

ウィンドウは、(uint)pointer.ToInt32()が長方形の配列へのポインタであることをどのように知るべきですか?それを呼び出すときに、この配列の長さをどのように知るべきですか? – Timbo

+0

Windowsは、あなたが知っているメッセージの翻訳を行います。カスタムメッセージの場合、データが何であるか分かりませんので、値を渡して何もしません。 – Andy

関連する問題