2013-08-16 46 views
19

在WinAPI上,HANDLE類型定義爲void*,因此在64位應用程序中,HANDLE值的範圍可能爲018446744073709551615。 但是這在實踐中是否真實?任何文件是否規定了這種HANDLE的整體範圍?64位應用程序上的Windows HANDLE的範圍是什麼?

例如,如果有人想將這個HANDLE作爲int32_t存儲在32位應用程序上,但這在64位應用程序中是完全正常的,但懷疑會持續下去。

+2

_Why_你需要在'int'中存儲'HANDLE'嗎?聽起來有問題。考慮一個'std :: map '。 – MSalters

+0

@MSalters這與POSIX文件描述符(即「int」)有關。我使用C,所以沒有STL,但是,我可以創建一個指向Windows'HANDLE'的第二個句柄系統,但這會比簡單的演員慢,所以我在這裏問。 – thelink2012

回答

19

MSDN指出:的Windows

64位版本使用32位處理的互操作性。 在32位和64位應用程序之間共享句柄時,只有 低32位有意義,因此可以安全地截斷句柄 (將它從64位傳遞到32位時)或符號擴展處理 (將它從32位傳遞到64位時)。可共享的句柄包括用於窗口(HWND)等用戶對象的句柄,GDI 對象(例如鋼筆和畫筆(HBRUSH和HPEN))的句柄以及指令對象(例如互斥鎖,信號量和文件句柄)的句柄。

這也是值得注意此評論該網頁上加入:

到跨進程邊界共享這樣的手柄的適當的方式是通過 零延伸32位處理爲64位,或通過反之亦然截斷 64位句柄至32位,丟棄最高位。

請注意「手勢擴展」與「零擴展」手柄之間的區別。

編輯:從已刪除這個問題的答案看到的討論情況來看,我想這符號擴展32位句柄在64位到達處理,而不是零擴展它要的意義保留處理的INVALID_HANDLE_VALUE值的正確處理。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx

+1

您所依靠的評論具有零權限。按照文檔。 –

+1

此外,您有足夠的聲望可以查看此頁面上最高票數的答案(刪除這個答案是有問題的),並且MSalters也參與了評論。 –

+1

@BenVoigt目前我沒有這種無法看到刪除的答案*(真棒,不知道)*但它被接受的答案之前,它已被刪除,任何ideia的原因?也許在評論上?出於好奇,如果作者想要,可以取消刪除? – thelink2012

2

我希望知道它在哪裏被記錄,但我的一個同事堅持認爲64位HWND句柄總是適合32位。我從來沒有見過這樣的情況,那不是真的,但是不能說明未來或者它的記錄。關於像HTREEITEM這樣的其他句柄,它們是完整的64位,我一直假設它們也適合32位。

+1

「我的同事」不是可靠的信息來源,特別是考慮到官方文件(請參閱接受的答案)不同意。 –

+0

@BoundaryIposition,Joe Willcoxson是正確的。來自64位進程的HTREEITEM可以非常容易地大於32位。這在Microsoft文檔中也有說明,具體來說,OS對象的句柄將是32位,並且用於簽名擴展,但這不包括其他類型的句柄,例如HTREEITEM。也許他的同事在微軟工作。 +1提到這個非常有用的方面。我正盯着一個通過SendMessage將句柄的三個半字節截斷爲64位進程的文件。 – Celess

+0

@Je Willcoxson 32位和64位互操作性(MSDN):https://msdn.microsoft.com/en-us/library/windows/desktop/ee872017(v=vs.85).aspx – Celess

相關問題