2013-05-02 47 views
1

我有一個使用CreateFileA打開COM端口的例程。 該函數被創建爲一個DLL,並且我有一個EXE(使用VS2010)進行調用以打開不同的COM端口。 一個觀察是,如果我使用相同的EXE打開不同的端口,返回的文件句柄號是不同的。 如果我打開EXE的多個實例並打開不同的COM端口,則返回的文件句柄號相同。 Eg-> 1 exe用於打開COM端口11,12,13,14,它們返回文件句柄編號 - 0x200,0x210,0x21c,0x220 4個exes,每個都打開一個COM端口,並且它們都返回File Handle數字 - 0x200。多個CreateFileA調用返回相同的文件句柄

我想知道這是否是由於Windows線程,這樣的exe的每個實例有一個單獨的線程,因此相同的文件號? 我沒有任何問題與使用我的EXE的端口進行通信。任何理解這一點的線索都會有幫助。 (另一個應用程序試圖使用此DLL,並具有返回相同的文件句柄數量的問題)

感謝 阿迪亞

回答

3

手柄的價值只有在一個過程是有效的。更清楚的是,句柄被實現爲某個內核對象表的索引(或偏移量)。該表存儲在內核內存中,並被分配給一個特定的進程,即每個進程都有自己的不同的對象表。

由於句柄只是某些表的偏移量,而且這些表對於不同的進程而言完全不同,因此不能爲不同的進程傳遞(或比較)HANDLE的值。回到你的案例,如果你的應用程序是簡單的和確定性的,當你重新運行應用程序時,你很有可能獲得相同的HANDLE值,因爲操作系統很可能會確定性地填充對象表。然而它不能保證,你不能依靠它。

由於句柄不能直接傳遞給不同的進程,因此Windows有DuplicateHandle函數,如果一個進程想要將同一對象傳遞給其他進程,則可以使用該函數。注意,使用DuplicateHandle,源句柄只能用於源進程,而目標句柄只能用於目標進程。

+0

謝謝Seva。我可以跟蹤過程和表格偏移嗎?在我的exe文件是? – Aditya 2013-05-03 00:18:26

+0

@Aditya,這些信息不會通過任何公共API暴露。 WindDbg調試器可以通過內部結構訪問它。檢出!句柄命令:http://msdn.microsoft.com/en-us/library/windows/hardware/ff563187(v=vs.85).aspx。不帶參數運行它將顯示進程中的所有句柄以及對象的類型(文件/目錄/註冊表鍵/內存段/信號量等)。 – 2013-05-03 03:22:26

相關問題