在我处理的 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,有关更多信息,请参阅

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top