除了GWL_USERDATA以外,还有什么方法可以存储对象指针?
时间:2020-03-05 18:42:10 来源:igfitidea点击:
在我使用的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问)。创建窗口时,通常的做法是通过SetWindowLong(hwnd,GWL_USERDATA,this)将" this"放置在窗口的用户数据区域中,这使我们可以拥有类似于MFC的回调或者紧密集成的" WndProc" ,视情况而定。问题在于,由于LONG仅32位宽,因此无法在Win64上运行。在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样式转换,有关更多信息,请参见
- http://www.ragestorm.net/blogs/?cat=20
- http://www.hackcraft.net/cpp/windowsThunk/