hwnd设置高位是否正常?

时间:2017-03-25 04:16:27

标签: c++ mfc hwnd cdialog

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

例如: 0xffffffffa5400382

基于此,我可以推断出我没有正确地将该值转换为int64 / string。我可以解决这个问题。但我觉得奇怪的是,这个人看起来不正确吗?

是否存在HWND可以设置高位的情况?这是一个正常的窗口,还是有一些关于hwnd的特殊结局呢?

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

1 个答案:

答案 0 :(得分:2)

您看到的结果来自句柄值的sign extension到64位整数。实际句柄值为0xa5400382,因为handle values are always in the 32-bit range,即使进程是64位!

因此,您应该将HWND转换为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()可能会抛出异常。