Qual è un'alternativa a GWL_USERDATA per memorizzare un puntatore a un oggetto?
Domanda
Nelle applicazioni Windows su cui lavoro, abbiamo un framework personalizzato che si trova direttamente sopra Win32 (non chiedere).Quando creiamo una finestra, la nostra pratica normale è mettere this
nell'area dati utente della finestra tramite SetWindowLong(hwnd, GWL_USERDATA, this)
, che ci consente di avere un callback simile a MFC o un callback strettamente integrato WndProc
, dipendente.Il problema è che questo non funzionerà su Win64, poiché LONG è largo solo 32 bit.Qual è la soluzione migliore a questo problema che funzioni sia sui sistemi a 32 che a 64 bit?
Soluzione
Imposta finestra lunga Ptr è stato creato per sostituire Imposta finestra lunga in questi casi.Il suo parametro LONG_PTR consente di memorizzare un puntatore per compilazioni a 32 o 64 bit.
LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);
Ricorda che anche le costanti sono cambiate, quindi l'utilizzo ora assomiglia a:
SetWindowLongPtr(hWnd, GWLP_USERDATA, this);
Inoltre, non dimenticare che ora per recuperare il puntatore è necessario utilizzare OttieniWindowLongPtr:
LONG_PTR GetWindowLongPtr(
HWND hWnd,
int nIndex
);
E l'utilizzo sarebbe simile (di nuovo, con le costanti modificate):
LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;
Altri suggerimenti
L'altra alternativa è SetProp/RemoveProp (quando si crea una sottoclasse di una finestra che utilizza già GWLP_USERDATA)
Un'altra buona alternativa è il thunk in stile ATL di WNDPROC, per maggiori informazioni a riguardo vedere