2010-01-31 71 views
3

爲什麼一個進程想要從Win32API中調用DuplicateHandle,並從另一個進程獲取它,而不是僅僅獲取某個對象本身的句柄?DuplicateHandle,爲什麼重複而不是僅僅獲取?

調用DuplicateHandle還是有一些優勢?

+0

我不知道你在問什麼。 – SLaks 2010-01-31 14:49:24

+0

爲什麼要調用DuplicateHandle而不是像通常那樣只是獲取對象的句柄? – 2010-01-31 14:53:19

回答

5

你可以在第6.8節「爲Microsoft Windows編程應用程序」中找到答案。

獲得某人自己的身份意識
有時您可能需要獲取線程的實際句柄而不是僞句柄。通過「真實」,我的意思是一個明確標識唯一線程的句柄。檢查以下代碼:
DWORD WINAPI ParentThread(PVOID pvParam) { 
    HANDLE hThreadParent = GetCurrentThread(); 
    CreateThread(NULL, 0, ChildThread, (PVOID) hThreadParent, 0, NULL); 
    // Function continues... 
} 

DWORD WINAPI ChildThread(PVOID pvParam) { 
    HANDLE hThreadParent = (HANDLE) pvParam; 
    FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime; 
    GetThreadTimes(hThreadParent, 
     &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime); 
    // Function continues... 
} 
你能看到這個代碼片段的問題嗎?這個想法是讓父線程傳遞一個標識父線程的線程句柄給子線程。但是,父線程傳遞一個僞句柄,而不是真正的句柄。當子線程開始執行時,它將僞句柄傳遞給GetThreadTimes函數,這會導致子線程獲取自己的CPU時間,而不是父線程的CPU時間。發生這種情況是因爲線程僞句柄是當前線程的句柄 - 也就是說,任何線程正在進行函數調用的句柄。

要修復此代碼,我們必須將僞句柄轉換爲真句柄。的DuplicateHandle函數(在第3章所討論的)可以做到這一點變換
1

在MSDN上看到這裏關於'DuplicateHandle'的用法。我能想到的最好的方法就是這種方式,如果你喜歡,可以比喻一下 - 假設你使用CreateHandle例程打開一個文件,然後調用DuplicateHandle將句柄傳遞給另一個線程,線程將從該線程讀取文件,只有手柄是重複的,因此線程不必再次調用CreateHandle ...

希望這會有所幫助, 最好的問候, 湯姆。

1

DuplicateHandle的一種可能用途是在32位進程和64位進程之間複製句柄。

注意:不能在I/O完成端口或套接字上使用。

1

DuplicateHandle的另一個用途是在多個進程打開文件時,文件使用FileOptions.DeleteOnClose。 (這樣的文件不能被多個進程打開,如果文件路徑是用來打開文件)

見我的答案在https://stackoverflow.com/a/36606283/2221472

相關問題