为什么一个进程想要从Win32API中调用DuplicateHandle,并从另一个进程获取它,而不是仅仅获取某个对象本身的句柄?DuplicateHandle,为什么重复而不是仅仅获取?
调用DuplicateHandle还是有一些优势?
为什么一个进程想要从Win32API中调用DuplicateHandle,并从另一个进程获取它,而不是仅仅获取某个对象本身的句柄?DuplicateHandle,为什么重复而不是仅仅获取?
调用DuplicateHandle还是有一些优势?
你可以在第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章所讨论的)可以做到这一点变换
在MSDN上看到这里关于'DuplicateHandle'的用法。我能想到的最好的方法就是这种方式,如果你喜欢,可以比喻一下 - 假设你使用CreateHandle例程打开一个文件,然后调用DuplicateHandle将句柄传递给另一个线程,线程将从该线程读取文件,只有手柄是重复的,因此线程不必再次调用CreateHandle ...
希望这会有所帮助, 最好的问候, 汤姆。
DuplicateHandle
的一种可能用途是在32位进程和64位进程之间复制句柄。
注意:不能在I/O完成端口或套接字上使用。
DuplicateHandle的另一个用途是在多个进程打开文件时,文件使用FileOptions.DeleteOnClose
。 (这样的文件不能被多个进程打开,如果文件路径是用来打开文件)
我不知道你在问什么。 – SLaks 2010-01-31 14:49:24
为什么要调用DuplicateHandle而不是像通常那样只是获取对象的句柄? – 2010-01-31 14:53:19