关于Windows:使用GWL_USERDATA替代存储对象指针是什么?

关于Windows:使用GWL_USERDATA替代存储对象指针是什么?

What's an alternative to GWL_USERDATA for storing an object pointer?

在我正在使用的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/

推荐阅读