Frage

In den Windows-Anwendungen, an denen ich arbeite, haben wir ein benutzerdefiniertes Framework, das direkt über Win32 liegt (fragen Sie nicht).Wenn wir ein Fenster erstellen, ist es unsere übliche Praxis, es zu platzieren this im Benutzerdatenbereich des Fensters über SetWindowLong(hwnd, GWL_USERDATA, this), was uns einen MFC-ähnlichen Rückruf oder eine enge Integration ermöglicht WndProc, abhängig.Das Problem ist, dass dies unter Win64 nicht funktioniert, da LONG nur 32 Bit breit ist.Gibt es eine bessere Lösung für dieses Problem, die sowohl auf 32- als auch auf 64-Bit-Systemen funktioniert?

War es hilfreich?

Lösung

SetWindowLongPtr wurde geschaffen, um es zu ersetzen SetWindowLong in diesen Fällen.Mit dem Parameter LONG_PTR können Sie einen Zeiger für 32-Bit- oder 64-Bit-Kompilierungen speichern.

LONG_PTR SetWindowLongPtr(      
    HWND hWnd,
    int nIndex,
    LONG_PTR dwNewLong
);

Denken Sie daran, dass sich auch die Konstanten geändert haben, sodass die Verwendung jetzt wie folgt aussieht:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

Vergessen Sie auch nicht, dass Sie zum Abrufen des Zeigers jetzt verwenden müssen GetWindowLongPtr:

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

Und die Verwendung würde so aussehen (wiederum mit geänderten Konstanten):

LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;

Andere Tipps

Die andere Alternative ist SetProp/RemoveProp (Wenn Sie ein Fenster unterklassifizieren, das bereits GWLP_USERDATA verwendet)

Eine weitere gute Alternative ist das ATL-Thunking von WNDPROC. Weitere Informationen hierzu finden Sie unter

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