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

===============>>#1 票数:36 已采纳

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;

===============>>#2 票数:9

另一种选择是SetProp / RemoveProp(当您为已经使用GWLP_USERDATA的窗口创建子类时)

另一个不错的选择是WNDPROC的ATL风格的thunking,有关详细信息,请参阅

  ask by Benjamin Pollack translate from so

未解决问题?本站智能推荐:

2回复

GWL_USERDATA用于存储对象指针的替代方法是什么?

In the Windows applications I work on, we have a custom framework that sits directly above Win32 (don't ask). 在我工作的Windows应用程序中,我们有一个直接位于Win32上方的自定义框
1回复

LVITEM字段是puColumns和piColFmt指针还是整数?

After discovering the fields of LVITEM for 64 bit in this question , there is one last thing I don't know. 在此问题中发现了LVITEM的64位字段之后,我不知道最后一件事。 The docu
1回复

适用于Windows64位的LVITEM

For a long time I tried to use the LVM_GETITEMW message with LVIF_TEXT mask to get the text of a ListView. 很长时间以来,我尝试将LVM_GETITEMW消息与LVIF_TEXT掩码一起使用以
1回复

在Windows7上以C++接收睡眠通知的最简单方法

I am writing an native c++ application that needs to do a quick bit of work if the Windows 7 system is put into sleep mode---otherwise it will unavoi
1回复

用于64位Windows的G++[关闭]

我在哪里可以获得64位Windows 7机器的GCC / G ++编译器?
11回复

存储此指针以在WndProc中使用的最佳方法

I'm interested to know the best / common way of storing a this pointer for use in the WndProc .我很想知道存储this指针以在WndProc使用的最佳/通用方法。 I know of several app