在我从事的 Windows 应用程序中,我们有一个直接位于 Win32 之上的自定义框架(不要问)。当我们创建一个窗口时,我们通常的做法是通过 将this
窗口的用户数据区放入SetWindowLong(hwnd, GWL_USERDATA, this)
,这使我们可以有一个类似 MFC 的回调或紧密集成的WndProc
,取决于。问题是这在 64 位 Windows 上不起作用,因为 LONG 只有 32 位宽。在 32 位和 64 位系统上都可以解决这个问题的更好的解决方案是什么?
Benjamin Pollack
问问题
19409 次
2 回答
41
创建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;
于 2008-08-22T18:21:41.783 回答
12
另一种选择是 SetProp/RemoveProp(当您对已经使用 GWLP_USERDATA 的窗口进行子类化时)
另一个不错的选择是 WNDPROC 的 ATL 风格的 thunking,有关更多信息,请参阅
于 2008-08-28T20:38:17.347 回答