GWL_USERDATA 存储对象指针的替代方案是什么?
题
在我处理的 Windows 应用程序中,我们有一个直接位于 Win32 之上的自定义框架(不要问)。当我们创建一个窗口时,我们正常的做法是把 this
在窗口的用户数据区域中通过 SetWindowLong(hwnd, GWL_USERDATA, this)
, ,这使我们能够拥有类似 MFC 的回调或紧密集成的 WndProc
, ,取决于。问题是这在 Win64 上不起作用,因为 LONG 只有 32 位宽。对于这个问题,有什么更好的解决方案可以同时在 32 位和 64 位系统上使用吗?
解决方案
设置窗口长指针 被创建来取代 设置窗口长度 在这些情况下。它的 LONG_PTR 参数允许您存储 32 位或 64 位编译的指针。
LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);
请记住,常量也发生了变化,因此现在的用法如下所示:
SetWindowLongPtr(hWnd, GWLP_USERDATA, this);
另外不要忘记现在要检索指针,您必须使用 获取窗口长指针:
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,有关更多信息,请参阅
不隶属于 StackOverflow