在我工作的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

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

1回复

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

在此问题中发现了LVITEM的64位字段之后,我不知道最后一件事。 该文档说: puColumns是一个UINT。 它是指向列索引数组的指针,用于指定要为此项目显示哪些列以及这些列的顺序。 piColFmt是一个整数。 它是指向以下标志(单独或组合)的数组的指针,这些标志
1回复

适用于Windows 64位的LVITEM

很长时间以来,我尝试将LVM_GETITEMW消息与LVIF_TEXT掩码一起使用以获取ListView的文本。 我的程序在32位上工作,但在64位体系结构上工作。 我发现问题出在LVITEM结构上。 不久,我的问题是哪种结构适合64位,为什么呢? 我用作LVITEMW结构的结构
1回复

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

我正在编写一个本机c ++应用程序,如果Windows 7系统进入睡眠模式,则它需要做一些快速的工作-否则,当系统唤醒时,它将不可避免地崩溃。 使用本机c ++注册系统事件(挂起)的最简单方法是什么? 我真的只是想做这些家伙所做的事情,但是我有一个任意的类(不是gui),我想设置一个
1回复

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

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

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

我很想知道存储this指针以在WndProc使用的最佳/通用方法。 我知道几种方法,但据我所知每种方法都有其自身的缺点。 我的问题是: 产生这种代码有什么不同的方式: 我可以想到Thunks,HashMaps,线程本地存储和Window User Data结构。 每种方法的利弊是什么? 代
1回复

在循环中使用GetWindow的替代方法是什么?

MSDN提到GetWindow()函数的以下备注。 与循环调用GetWindow相比, EnumChildWindows函数更可靠。 调用GetWindow来执行此任务的应用程序可能会陷入无限循环或引用已被破坏的窗口的句柄。 仅对列出所有窗口感兴趣时,使用EnumChildW
1回复

在JNA中创建本地Windows窗口,并使用GWL_WNDPROC创建一些GetWindowLong

美好的一天, 我一直在使用JNA与Windows API进行交互,现在在创建窗口时遇到了麻烦。 据我所做的以下工作:1.在现有窗口的子窗口中创建一个子窗口,并为其获取有效的处理程序。 2.理解Windows中的每个窗口都有一个不间断的消息调度循环。 3.理解将窗口包含在message
1回复

Windows 8、8.1和10上IApplicationAssociationRegistration接口的替代方法

我是这个主题的新手。 如果有些不清楚的地方需要澄清,请发表评论,我将尝试提供更多详细信息。 我一直在从事一个几年前实施的项目,需要进行一些调整以适应当今的需求。 此Windows桌面应用程序具有使用IApplicationAssociationRegistration接口的两种方法
1回复

验证签名/证书的最佳方法是什么?

我正在开发一个应用程序,在该应用程序中,我必须验证2个文件是否使用相同的证书(带有我们的证书)签名。 如果不是,则中止该程序。 在这个问题中,我发现应该怎么做: 完全验证证书链,以确保证书的完整性和真实性 检查发行人名称 检查主题名称 检查密钥用法字段。
1回复

ShellAPI的替代方法来获取文件列表和图标

我需要使用相关文件图标和特殊位置(如网络计算机)构建文件/文件夹树。 当前,我正在使用Shell API来实现它:SHGetFileInfo,IShellFolder.EnumObjects和其他函数。 它在大多数情况下都可以正常工作,但有时在客户的计算机上会导致各种错误,例如系统库