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