当将int类型转换为HWND时出现警告

3

我正在使用C++为Win64编写一个程序,该程序由父程序执行,并且需要将其父窗口设置为父程序的窗口。父程序通过命令行参数传入它的 HWND, 我在将其转换为 HWND 之前将其解析为 int (使用 stoi())。下面是我的代码简化版:

int parentHwnd = stoi(args[HWND_INDEX]);
SetParent(childHwnd, (HWND) parentHwnd);

然而,在编译时我遇到了以下错误:
warning C4312: 'type cast': conversion from 'int' to 'HWND' of greater size

有没有安全的方法将int转换为HWND并消除这个错误?或者我应该将给定的命令行参数解析为一些其他类型而不是int,以便能够安全地转换为HWND


2
根据这个文档HWND 应该进行符号扩展。我不确定如何最好地实现它,希望有C++专家能提供帮助。 - Harry Johnston
3
你还应该阅读《是否合法拥有跨进程的父/子或所有者/拥有窗口关系?》(Is it legal to have a cross-process parent/child or owner/owned window relationship?)这篇文章。其中的关键引用是:“是的,从技术上讲是合法的。从技术上讲,玩杂耍锯也是合法的。” - Harry Johnston
5
(HWND)IntToPtr(parentHwnd) - RbMm
1个回答

0
  1. 在传递指针/句柄时,应使用std::stoull;
  2. 并使用显式转换 HWND parentHwnd = (HWND)std::stoull(args[HWND_INDEX]);

我不确定我理解有符号/无符号在这里的适用性。 - c-smile
1
糟糕!今天可能有点迷糊,我第一次就是正确的。你正在将参数解释为一个无符号64位值,如果父级是32位,则这不会可靠地工作,因为效果是在处理句柄时进行零扩展,而你应该进行符号扩展。将其作为有符号值而不是无符号值传递将始终起作用。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接