对于x64目标构建,从'OLE_HANDLE'转换为'HICON'的正确方法是什么?

特别是对于普通的C-Style强制转换,我在使用x64配置进行编译时会收到此警告:

警告C4312:'type cast':从'OLE_HANDLE'转换为更大尺寸的'HICON'

以下是有问题的代码:

imgList.Add((HICON)ohIcon);

上面的代码对我来说很好,但我想在构建x64时摆脱警告。

有帮助吗?

解决方案

H将它放弃,在这种情况下,库代码创建了一个独特的类型,以便为您提供更多的类型安全性(在旧C API的时代)。

它们实际上都是HANDLE,它是一个内核对象,并不真正关心资源是什么,只是你有一个'句柄'。请记住,API是C语言,因此请使用C样式转换,当您要删除它时,请使用DeleteObject()。

编辑:64位呃...问题是因为MS更新了Handles为64位,但是单独留下了OLE的东西。幸运的是,他们所做的就是用零填充额外的位。

尝试使用 LongToHandle转换例程并查看 MIDL移植指南 - 向下滚动到“ ; USER和GDI句柄是符号扩展的32b值“部分。

其他提示

假设您正在使用基于问题的Microsoft Visual Studio ......

如果您只为32位目标开发,可以通过关闭项目选项”检测64位可移植性问题“ (C ++编译器选项/ Wp64)。

如果您正在为64位目标开发,那么@Harper可能是正确的,您需要更多地挖掘正确的方法来处理这个问题。您可能需要阅读本白皮书作为起点;转到有关USER和GDI句柄的部分。

我做了一点挖掘 - OLE_HANDLE似乎是一个无符号长,而HICON是一个空*。在32位Windows中,这些大小相同,但在Windows x64中,void *为64位。没有一种安全的方法来进行此转换 - 额外的32位是未定义的。不幸的是,我能够挖掘出涉及ULONGs的唯一建议(OLE_HANDLEs甚至是罕见的野兽)只是简单地说“不要把它强制转换为指针”。

我怀疑“正确”的是回答“适当”的问题。在他们之间施放的方式是“不要那样做”。不可否认,这不是很有帮助...... OLE_HANDLE首先来自哪里?听起来你将不得不使用OLE_HANDLE重写代码,以便在任何地方使用HICON。

HICON hSomeIcon = (HICON) hSomeOLEHandle;

即。它们是可以互换的。

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