30

在我从事的 Windows 应用程序中,我们有一个直接位于 Win32 之上的自定义框架(不要问)。当我们创建一个窗口时,我们通常的做法是通过 将this窗口的用户数据区放入SetWindowLong(hwnd, GWL_USERDATA, this),这使我们可以有一个类似 MFC 的回调或紧密集成的WndProc,取决于。问题是这在 64 位 Windows 上不起作用,因为 LONG 只有 32 位宽。在 32 位和 64 位系统上都可以解决这个问题的更好的解决方案是什么?

4

2 回答 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 回答