What's an alternative to GWL_USERDATA for storing an object pointer? What's an alternative to GWL_USERDATA for storing an object pointer? windows windows

What's an alternative to GWL_USERDATA for storing an object pointer?


SetWindowLongPtr was created to replace SetWindowLong in these instances. It's LONG_PTR parameter allows you to store a pointer for 32-bit or 64-bit compilations.

LONG_PTR SetWindowLongPtr(          HWND hWnd,    int nIndex,    LONG_PTR dwNewLong);

Remember that the constants have changed too, so usage now looks like:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

Also don't forget that now to retrieve the pointer, you must use GetWindowLongPtr:

LONG_PTR GetWindowLongPtr(          HWND hWnd,    int nIndex);

And usage would look like (again, with changed constants):

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


The other alternative is SetProp/RemoveProp (When you are subclassing a window that already uses GWLP_USERDATA)

Another good alternative is ATL style thunking of the WNDPROC, for more info on that, see