tagger tag windows winapi win64

windows - tag - ¿Cuál es una alternativa a GWL_USERDATA para almacenar un puntero de objeto?



tag folders (2)

La otra alternativa es SetProp / RemoveProp (cuando se subclasifica una ventana que ya usa GWLP_USERDATA)

Otra buena alternativa es ATL estilo thunk del WNDPROC, para más información sobre eso, ver

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 habitual es poner this en el área de datos de usuario de la ventana a través de SetWindowLong(hwnd, GWL_USERDATA, this) , lo que nos permite tener una devolución de llamada similar a MFC o un WndProc estrechamente integrado, según sea el caso. El problema es que esto no funcionará en Win64, ya que LONG tiene solo 32 bits de ancho. ¿Cuál es la mejor solución para este problema que funciona en sistemas de 32 y 64 bits?


SetWindowLongPtr fue creado para reemplazar SetWindowLong en estas instancias. Su parámetro LONG_PTR le permite almacenar un puntero para compilaciones de 32 bits 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 olvide que ahora para recuperar el puntero, debe usar GetWindowLongPtr :

LONG_PTR GetWindowLongPtr( HWND hWnd, int nIndex );

Y el uso se vería como (de nuevo, con constantes cambiadas):

LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA); MyObject* pMyObject = (MyObject*)lpUserData;