<p>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 <code>this</code> in the window's user data area via <code>SetWindowLong(hwnd, GWL_USERDATA, this)</code>, which allows us to have an MFC-like callback or a tightly integrated <code>WndProc</code>, 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?</p>

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;
```
```