Was ist eine Alternative zu GWL_USERDATA zum Speichern eines Objektzeigers?
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?
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