Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

In the Windows applications I work on, we have a custom framework that sits directly above Win32 (don't ask). When we create a window, our normal practice is to put this in the window's user data area via SetWindowLong(hwnd, GWL_USERDATA, this), which allows us to have an MFC-like callback or a tightly integrated WndProc, depending. The problem is that this will not work on 64-bit Windows, since LONG is only 32-bits wide. What's a better solution to this problem that works on both 32- and 64-bit systems?

like image 564
Benjamin Pollack Avatar asked Aug 22 '08 18:08

Benjamin Pollack


2 Answers

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;
like image 147
Chris Avatar answered Nov 11 '22 18:11

Chris


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

  • http://www.ragestorm.net/blogs/?cat=20
  • http://www.hackcraft.net/cpp/windowsThunk/
like image 12
Anders Avatar answered Nov 11 '22 17:11

Anders