Frage

Ich habe Problem mit dem Inhalt eines Zeigers als WParam bestand aus einer 32-Bit-C # Anwendung wird auf einen C ++ 64-Bit-Prozess auf dem Weg verändert wird.

Es gibt zwei Prozesse 32.exe (in C #) und 64.exe (in C ++). 64.exe wird als Kindprozess des 32.exe gestartet. 32.exe Postfenstermeldung für 64.exe, von denen eines ein WParam hat, die ein Zeiger auf ein Feld von Strukturen RECT ist. Sowohl 64.exe und 32.exe haben eine gemeinsame DLL (geschrieben in C ++, aber für verschiedene Plattformen, natürlich kompiliert), genannt 32.dll und 64.dll.

Eine Funktion ein RECT * in 32.dll erwartet wird direkt von 32.exe mit derselben RECT * genannt, die später gebucht wird, und das funktioniert gut. Danach postet er eine Nachricht an 64.exe, die die gleiche Funktion aufruft, und wirft die WParam auf RECT *:

else if (WM_SetDisabledAreas == message)
{
    SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}

Die Nachricht geschrieben wird, wie folgt:

    if (Is64Bit() && SubProcess64 != null)
    {
        Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
            (uint)pointer.ToInt32(), length);
    }
    MessageBox.Show(pointer.ToString());
    DLL32.SetDisabledAreas(pointer, length);

Mit dem Debuggen ich bestätigt habe, dass die Nachricht empfangen wird, aber die WParam-Adresse ist nicht das gleiche wie es vorher war. Dies ist nicht unerwartet, aber der Inhalt des Speichers weist es jetzt ist nicht definiert (und ich bekomme eine Zugriffsverletzung bei dem Versuch zu sehen, was es ist).

Was ist denn hier passiert?

War es hilfreich?

Lösung

Jeder der beiden Prozesse hat einen eigenen Adressraum, so dass der Zeiger aus dem Prozess 32.exe nicht gültig in 64.exe ist.

Dies hat jedoch nichts mit 32bit vs 64bit zu tun überhaupt. Sie haben nur eine Interprozess-Kommunikationstechnik Ihrer Wahl verwenden, um die Daten zwischen den beiden Prozessen zu übertragen.

Zum Beispiel könnten Sie Create einen benannten Abschnitt des gemeinsam genutzten Speichers zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top