2009-11-30 64 views

回答

6

它們可以共享的事實並不意味着Win64進程只使用低32位?至少據我所知,Windows句柄是索引而不是指針,所以除非MS想要允許超過2^32個窗口/文件/互斥量/等。句柄沒有理由使用Win64上的void*的高32位。

+7

我看到了這個意思,但是在MSDN中似乎沒有具體的文檔說明只有低32位被使用並且會被使用,因此這樣做是安全的。 由於沒有記錄,對窗口句柄的當前底層實現的瞭解並不能保證在未來版本的Windows中不會更改。 – 2009-11-30 22:14:30

+1

如果說MS擅長的一件事是它保持向後兼容性。我同意在這個問題上找到一些明確的陳述是很好的,但是看起來你只會得到一個隱含的陳述。也許你應該在諸如'microsoft.public.windows.64bit.general'或'microsoft.public.windows.app_compatibility'之類的論壇中提問(見http://www.aumha.org/nntp.php)一些MS開發者必須知道肯定... – 2009-11-30 22:26:17

+1

@Marc:「MSDN中的特定文檔」就是您鏈接到的聲明。它並不真正說只有低32位被使用,實際上我希望Win64至少設置一個高位 - 只是爲了發現已被截斷的句柄 - 但低32位應該足以唯一地確定一個窗口。 – MSalters 2009-12-01 09:32:30

1

我認爲你是對的一般謹慎。但是,MSDN聲稱他們可以共享是我們程序員的合同。他們不能很好地說「今天分享」,然後明天「不再」,而不會破壞大量的軟件。

同樣,對於在給定機器上同時運行的x64和32位軟件,並且爲了大家相處,HWND(和許多HANDLE)必須繼續保持32位併兼容。

我想我說的是我認爲這是一個非常安全的選擇,至少在Windows 7的整個生命週期中,可能是Windows「下一個」。

11

我剛收到一封電子郵件從Microsoft WOW64開發誰證實:

句柄是32位的,可以安全地截斷/零擴展。內核對象句柄和USER/GDI句柄都是如此。

2

有Microsoft接口定義語言(MIDL)移植指南一看,第12頁 (http://msdn.microsoft.com/en-us/library/ms810720.aspx)

這裏看看現實用戶和GDI句柄符號擴展32B值

16

丹尼爾·羅斯上面所指出的,現在MSDN documentation指出:

...它是安全的截斷手柄(從路過的時候就64位到32位)或簽名擴展句柄(將其從32位傳遞到64位時) T)。

這裏似乎仍然存在一些混淆,因爲我被告知零擴展是WOW64 dev的正確方法。如果您正在編寫從32位模塊獲取句柄的64位模塊,最安全的方法是僅比較句柄的低32位(即截斷)。否則,您可能會遇到符號擴展與零擴展差異。

相關問題