gpt4 book ai didi

c - SetWindowPos 在 64 位 Windows 中编译错误

转载 作者:太空狗 更新时间:2023-10-29 17:13:19 25 4
gpt4 key购买 nike

我目前正在更改我们的代码库以使其在 64 位架构下编译。我必须做出的大部分更改都是显而易见的,但这一更改让我感到难过。 SetWindowPos 有第二个参数,hWndInsertAfter,它可以是窗口句柄,也可以是预定义值之一 HWND_TOPHWND_BOTTOMHWND_TOPMOSTHWND_NOTOPMOST(有关 MSDN 信息,请参阅 here)。这些值在 WinUser.h 中定义。

在 32 位架构中,在对 SetWindowPos 的调用中使用其中一个可以正常工作,但在 64 位架构中,编译器会这样提示:

warning C4306: 'type cast' : conversion from 'int' to 'HWND' of greater size

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

#define HWND_TOPMOST ((HWND)-1)

我需要更改什么才能在 64 位体系结构中进行编译,而编译器不会抛出警告?我可以使用 #pragma warning( disable: 4306 ) 禁用警告,或者在 #define 中使用 64 位 int 来创建我自己的定义,但肯定有一种“正确的”Microsoft 方法可以做到这一点?

最佳答案

触发警告是因为您将 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建议

Project Settings | C/C++ | General and turn off "Detect 64-bit portability issues"

或在命令行中传递/wd4306

关于c - SetWindowPos 在 64 位 Windows 中编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com