在我工作的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问).当我们创建一个窗口时,我们通常的做法是将this
窗口的用户数据区域放入SetWindowLong(hwnd, GWL_USERDATA, this)
,这样我们就可以进行类似MFC的回调或紧密集成WndProc
.问题是这不适用于Win64,因为LONG只有32位宽.什么是解决这个问题的更好的解决方案适用于32位和64位系统?
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;
另一种选择是SetProp/RemoveProp(当您为已经使用GWLP_USERDATA的窗口创建子类时)
另一个不错的选择是WNDPROC的ATL风格的thunking,有关详细信息,请参阅
http://www.ragestorm.net/blogs/?cat=20
http://www.hackcraft.net/cpp/windowsThunk/