2017-03-25 64 views
0

我將HWND傳遞給一個子進程,以便它可以向我發送有關其進度的消息。有時候,我永遠不會收到來自子流程的任何消息。 在調查過程中,我發現傳遞給子進程的GetSafeHwnd()似乎返回了我不期望的值。hwnd的高位設置是否正常?

例如:在此基礎上 0xffffffffa5400382

,我大概可以推斷,我不是那個正確值轉換爲/從一個Int64 /串正常。我可以解決這個問題。但是我覺得奇怪的是,這個HWN只是看起來不正確?

是否有HWND可以設置高位的場景?這是一個正常的窗口,還是有什麼特別的關於HWW結束這樣?

我在C++中,這是一個基於CDialog的應用程序窗口。

+1

過程是32位還是64位?手柄可以設置任何位,高位沒什麼特別的。 –

+0

這兩個進程都是64位的。 –

回答

2

您看到的結果來自句柄值的sign extension到64位整數。實際句柄值爲0xa5400382,因爲handle values are always in the 32-bit range,即使進程是64位!

所以,你應該投的HWNDstd::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 
} 

,因爲如果轉換失敗std::stoul()可能會拋出異常的try/catch塊是必需的。

+0

有趣的@ zett42。我無法在我的機器上重現這一點,所以我正在採取日誌記錄。記錄HWND的代碼如下所示:我沒有看到句柄值始終爲32位,並且在這方面它們可以安全地截斷。我將觀察下一個實例,我們的代碼處理的窗口句柄看起來很大。 –

+0

@Leo如果點擊灰色複選標記對您有用,請接受答案。 – zett42

+0

感謝您的意見@ zett42。一旦我理解了我看到的更好的問題,我會將其標記爲答案。不幸的是,我無法在這些評論中輸入回車(Stupid Edge)。我記錄的代碼就像這樣uint64 nOwnderHwnd =(uint64)GetSafeHwnd();日誌(「%I64x」,nOwnerHwnd);我希望那一行不要做一個32位簽名進位?但我所看到的是這樣的:「ffffffffe22400c8」。如果我將它更改爲「%I64u」,我會得到這個「18446744073208594632」。 –