2

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 アドレスは以前と同じではありません。これは予期しないことではありませんが、現在ポイントしているメモリの内容は定義されていません (そこにあるものを確認しようとすると、アクセス違反が発生します)。

ここで何が起きてるの?

4

1 に答える 1

5

2 つのプロセスにはそれぞれ独自のアドレス空間があるため、プロセス 32.exe からのポインターは 64.exe では有効ではありません。

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

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

于 2009-07-06T12:24:25.133 に答える