对于x64目标构建,从'OLE_HANDLE'转换为'HICON'的正确方法是什么?
特别是对于普通的C-Style演员,我在使用x64配置编译时会收到此警告:
警告C4312:'type cast':从'OLE_HANDLE'转换为更大尺寸的'HICON'
以下是有问题的代码:
imgList.Add((HICON)ohIcon);
上面的代码对我来说很好,但我想在构建x64时摆脱警告。
答案 0 :(得分:4)
H将它放弃,在这种情况下,库代码创建了一个独特的类型,以便为您提供更多的类型安全性(在旧C API的时代)。
它们实际上都是HANDLE,它是一个内核对象,并不真正关心资源是什么,只是你有一个'句柄'。记住API是C语言,所以使用C样式转换,当你要删除它时,使用DeleteObject()。
编辑:64位呃...问题是因为MS更新了Handles为64位,但是单独留下了OLE的东西。幸运的是,他们所做的就是用零填充额外的位。
尝试使用LongToHandle conversion routines并查看MIDL porting guide - 向左滚动到“USER和GDI句柄符号扩展32b值”部分。
答案 1 :(得分:3)
假设您正在使用基于问题的Microsoft Visual Studio ......
如果您仅针对32位目标进行开发,则可以通过关闭项目选项"Detect 64-bit Portability Issues" (C++ compiler option /Wp64).来选择禁用此(以及其他一些类似的警告)
如果您正在为64位目标开发,那么@Harper可能是正确的,您需要更多地挖掘正确的方法来处理这个问题。您可能希望阅读this white paper作为起点;转到有关USER和GDI句柄的部分。
答案 2 :(得分:1)
我做了一点挖掘 - OLE_HANDLE似乎是一个无符号长,而HICON是一个空*。在32位Windows中,这些大小相同,但在Windows x64中,void *为64位。没有一种安全的方法来进行此转换 - 额外的32位是未定义的。不幸的是,我能够挖掘出涉及ULONGs的唯一建议(OLE_HANDLEs甚至是罕见的野兽)只是说“不要把它强制转换为指针”。
答案 3 :(得分:1)
我怀疑在他们之间施放“正确”方式的“正确”答案是“不要那样做”。不可否认,这不是很有帮助...... OLE_HANDLE首先来自哪里?听起来你将不得不使用OLE_HANDLE重写代码,以便在任何地方使用HICON。
答案 4 :(得分:0)
HICON hSomeIcon = (HICON) hSomeOLEHandle;
即。它们是可以互换的。