64位Windows中的SetWindowPos编译错误

时间:2013-11-04 16:49:13

标签: c winapi visual-studio-2012

我正在改变我们的代码库,使其在64位架构下进行编译。我必须做出的大部分改变是显而易见的,但这一次让我感到难过。 SetWindowPos有第二个参数hWndInsertAfter,可以是窗口句柄,也可以是预定义值HWND_TOPHWND_BOTTOMHWND_TOPMOST和{{ 1}}(有关MSDN信息,请参阅here)。这些值在HWND_NOTOPMOST中定义。

在32位体系结构中,使用WinUser.h调用中的一种工作正常,但在64位中,编译器因此抱怨:

  

警告C4306:'type cast':从'int'转换为'HWND'   更大的尺寸

这是因为#defines正在将[32位]整数转换为HWND,例如:

SetWindowPos

如果没有编译器发出警告,我需要更改什么才能在64位架构中进行编译?我可以使用#define HWND_TOPMOST ((HWND)-1)禁用警告,或者使用#define中的64位int进行自己的定义,但是肯定有一种“正确”的Microsoft方式吗?

2 个答案:

答案 0 :(得分:1)

触发警告是因为您将32位int-1转换为64位指针类型void*,而没有任何插入转换为64位整数类型例如intptr_t。在这种情况下,MSVC 应该已经抑制了警告,因为(A)它仅由系统提供的宏HWND_TOPMOST的扩展触发,而(B)违规int是一个十进制文字,但显然MSVC的开发人员没有想到那些启发式。

除非你对

感到满意,否则你的代码中没有任何东西可以使警告静音
#undef HWND_TOPMOST
#define HWND_TOPMOST ((HWND)(intptr_t)-1)

或者,您可以尝试在IDE中禁止它。 This thread建议

  

项目设置| C / C ++ |常规并关闭“检测64位可移植性问题”

或在命令行上传递/wd4306

答案 1 :(得分:1)

好的,经过多次测试,问题是我的文件是.c文件。我将其重命名为.cpp和SetWindowPos然后编译没有错误(相反,在我创建的新测试应用程序中尝试'裸骨'解决方案,当我将默认.cpp文件重命名为.c文件时,它开始抱怨)

看起来.c文件不希望能够将32位int值转换为64位指针。这是有道理的,但没有解释为什么它在.cpp文件中有效。如果有人对此有任何想法,请在评论中注明......