2010-01-31 70 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

相关问题