hwnd 设置高位是否正常?
Is it normal for an hwnd to have its high bit set?
我正在将我的 HWND 传递给一个子进程,这样它就可以向我发送有关其进度的消息。有时我从未收到来自子流程的任何消息。
在调查时,我发现我传递给子进程的 GetSafeHwnd() 似乎返回了我不期望的值。
例如:
0xffffffffa5400382
基于此,我可能可以推断出我没有正确转换该值 to/from 和 int64/string。我可以解决这个问题。但是我觉得奇怪的是这个 hwnd 看起来不对?
是否存在 HWND 可以设置高位的情况?这是正常的 window,还是 hwnd 有什么特别的地方会变成这样?
我在使用 C++,这是一个基于 CDialog 的应用程序 window。
您看到的结果来自 sign extension of the handle value to a 64-bit integer. The actual handle value is 0xa5400382
, because 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()
可能会抛出异常。
我正在将我的 HWND 传递给一个子进程,这样它就可以向我发送有关其进度的消息。有时我从未收到来自子流程的任何消息。 在调查时,我发现我传递给子进程的 GetSafeHwnd() 似乎返回了我不期望的值。
例如: 0xffffffffa5400382
基于此,我可能可以推断出我没有正确转换该值 to/from 和 int64/string。我可以解决这个问题。但是我觉得奇怪的是这个 hwnd 看起来不对?
是否存在 HWND 可以设置高位的情况?这是正常的 window,还是 hwnd 有什么特别的地方会变成这样?
我在使用 C++,这是一个基于 CDialog 的应用程序 window。
您看到的结果来自 sign extension of the handle value to a 64-bit integer. The actual handle value is 0xa5400382
, because 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()
可能会抛出异常。