除了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/