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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top