GWL_USERDATA用于存储对象指针的替代方法是什么?

时间:2008-08-22 18:16:52

标签: windows winapi win64

在我使用的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问)。当我们创建一个窗口时,我们通常的做法是通过thisSetWindowLong(hwnd, GWL_USERDATA, this)放在窗口的用户数据区域中,这样我们就可以进行类似MFC的回调或紧密集成的WndProc,根据。问题是这不适用于Win64,因为LONG只有32位宽。对于这个适用于32位和64位系统的问题,有什么更好的解决方案?

2 个答案:

答案 0 :(得分:36)

创建

SetWindowLongPtr以在这些实例中替换SetWindowLong。它的LONG_PTR参数允许您存储32位或64位编译的指针。

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

请记住,常量也已更改,因此现在使用情况如下:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

另外不要忘记现在要检索指针,您必须使用GetWindowLongPtr

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

用法看起来像(再次,改变了常量):

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

答案 1 :(得分:9)

另一个替代方案是SetProp / RemoveProp(当您为已经使用GWLP_USERDATA的窗口创建子类时)

另一个不错的选择是WNDPROC的ATL风格的thunking,有关详细信息,请参阅