繁体   English   中英

设置高位设置是否正常?

[英]Is it normal for an hwnd to have its high bit set?

我将HWND传递给子流程,以便它可以向我发送有关进度的消息。 有时,我从子流程中从未收到任何消息。 在调查过程中,我发现我传递给子流程的GetSafeHwnd()似乎返回的值不是我所期望的。

例如:0xffffffffa5400382

基于此,我可能可以推断出我没有正确地将值转换为int64 / string。 我可以解决。 但是我发现奇怪的是,这个hwnd看起来不正确吗?

HWND是否可以设置高位? 这是正常的窗口,还是hwnd的某些特殊之处最终会导致这种情况?

我在C ++中,这是一个基于CDialog的应用程序窗口。

您看到的结果是将句柄值的符号扩展为64位整数。 实际的句柄值为0xa5400382 ,因为即使进程为64位, 句柄值也始终在32位范围内

因此,您应该将HWND std::uint32_t转换为std::uint32_t并将其转换为字符串(或者反过来)。

将HWND转换为wstring:

HWND hwnd = GetSafeHwnd();
std::uint32_t handleValue = reinterpret_cast<std::uint32_t>( hwnd );
std::wstring handleValueStr = std::to_wstring( handleValue );

将wstring转换为HWND:

try
{
    std::uint32_t handleValue = std::stoul( someString );
    HWND handle = reinterpret_cast<HWND>( handleValue );
}
catch( std::exception& e )
{
    // Handle string conversion error
}

需要try / catch块,因为如果转换失败, std::stoul()可能会引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM