64位Windows中的SetWindowPos编译错误

Nic*_*haw 7 c winapi visual-studio-2012

我正在改变我们的代码库,使其在64位架构下进行编译.我必须做出的大部分改变是显而易见的,但这一次让我感到难过. SetWindowPos具有第二个参数,hWndInsertAfter即可以是一个窗口句柄,或预定义的值中的一个HWND_TOP,HWND_BOTTOM,HWND_TOPMOSTHWND_NOTOPMOST(见此处为MSDN信息).这些值在中定义WinUser.h.

在32位架构中,使用其中一个调用SetWindowPos工作正常,但在64位,编译器抱怨:

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

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

#define HWND_TOPMOST ((HWND)-1)

在没有编译器发出警告的情况下,我需要更改以在64位架构中进行编译?我可以使用#pragma warning( disable: 4306 )#define中的64位int 来禁用警告或使用我自己的定义,但是肯定有一种"正确"的Microsoft方法吗?

Nic*_*haw 1

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

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