在我正在使用的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问)。 创建窗口时,通常的做法是通过SetWindowLong(hwnd, GWL_USERDATA, this)将this放入窗口的用户数据区域,这将使我们可以像MFC一样回调或紧密集成WndProc。 问题在于,由于LONG仅32位宽,因此无法在Win64上运行。 在32位和64位系统上都可以解决此问题的更好解决方案是什么?
创建SetWindowLongPtr来替换这些实例中的SetWindowLong。 它的LONG_PTR参数允许您存储32位或64位编译的指针。
1 2 3 4 5
| LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
); |
请记住,常量也已更改,因此用法如下所示:
1
| SetWindowLongPtr(hWnd, GWLP_USERDATA, this); |
同样不要忘记,现在要检索指针,必须使用GetWindowLongPtr:
1 2 3 4
| LONG_PTR GetWindowLongPtr(
HWND hWnd,
int nIndex
); |
用法看起来像(再次,更改了常量):
1 2
| LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData; |
另一种选择是SetProp / RemoveProp(在子类化已经使用GWLP_USERDATA的窗口时)
另一个不错的选择是WNDPROC的ATL样式转换,有关更多信息,请参见
-
http://www.ragestorm.net/blogs/?cat=20
-
http://www.hackcraft.net/cpp/windowsThunk/