Ce qui est une alternative à GWL_USERDATA pour stocker un pointeur d'objet?
Question
Dans les applications Windows je travaille, nous avons une coutume cadre qui se trouve directement au-dessus de Win32 (ne demandez pas).Lorsque nous créons une fenêtre, notre pratique normale consiste à mettre this
dans la fenêtre de l'utilisateur de la zone de données via SetWindowLong(hwnd, GWL_USERDATA, this)
, qui nous permet d'avoir une MFC-comme rappel ou une solution étroitement intégrée WndProc
, en fonction.Le problème est que cela ne fonctionnera pas sur Win64, depuis LONGTEMPS, n'est que de 32 bits de large.Ce qui est une meilleure solution à ce problème qui fonctionne sur les versions 32 et 64 bits des systèmes?
La solution
SetWindowLongPtr a été créé pour remplacer SetWindowLong dans ces instances.C'est LONG_PTR paramètre vous permet de stocker un pointeur 32 bits ou 64 bits de compilations.
LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);
Rappelez-vous que les constantes ont changé aussi, ainsi, l'utilisation ressemble maintenant à:
SetWindowLongPtr(hWnd, GWLP_USERDATA, this);
Aussi, ne pas oublier que maintenant pour récupérer le pointeur, vous devez utiliser GetWindowLongPtr:
LONG_PTR GetWindowLongPtr(
HWND hWnd,
int nIndex
);
Et l'utilisation ressemblerait (encore une fois, avec le changement des constantes):
LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;
Autres conseils
L'autre alternative est SetProp/RemoveProp (Lorsque vous êtes sous-classement d'une fenêtre qui utilise déjà GWLP_USERDATA)
Une autre bonne alternative est d'ATL style médiateur de la WNDPROC, pour plus d'info sur ce point, voir