¿Cuál es una alternativa a GWL_USERDATA para almacenar un puntero de objeto?
Pregunta
En las aplicaciones de Windows en las que trabajo, tenemos un marco personalizado que se encuentra directamente encima de Win32 (no preguntes).Cuando creamos una ventana, nuestra práctica normal es poner this
en el área de datos de usuario de la ventana mediante SetWindowLong(hwnd, GWL_USERDATA, this)
, lo que nos permite tener una devolución de llamada similar a MFC o un sistema estrechamente integrado WndProc
, dependiendo.El problema es que esto no funcionará en Win64, ya que LONG tiene sólo 32 bits de ancho.¿Cuál es una mejor solución a este problema que funcione en sistemas de 32 y 64 bits?
Solución
EstablecerVentanaLongPtr fue creado para reemplazar EstablecerVentanaLong en estos casos.Su parámetro LONG_PTR le permite almacenar un puntero para compilaciones de 32 o 64 bits.
LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);
Recuerde que las constantes también han cambiado, por lo que el uso ahora se ve así:
SetWindowLongPtr(hWnd, GWLP_USERDATA, this);
Además, no olvides que ahora para recuperar el puntero, debes usar ObtenerVentanaLongPtr:
LONG_PTR GetWindowLongPtr(
HWND hWnd,
int nIndex
);
Y el uso sería así (nuevamente, con constantes modificadas):
LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;
Otros consejos
La otra alternativa es SetProp/RemoveProp (cuando subclases una ventana que ya usa GWLP_USERDATA)
Otra buena alternativa es el procesamiento estilo ATL de WNDPROC; para obtener más información al respecto, consulte