为什么一个进程想要从Win32API调用DuplicateHandle,并从另一个进程获取它而不是只获取某个对象本身的句柄?
调用DuplicateHandle或其他东西有什么好处吗?
答案 0 :(得分:6)
您可以在“Microsoft Windows编程应用程序”的第6.8章中找到答案。
获得一个人自己的身份感 有时您可能需要获取线程的实际句柄而不是伪句柄。 “真实”是指一个明确标识唯一线程的句柄。检查以下代码:
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 :(得分:1)
请在MSDN上查看有关“DuplicateHandle”用法的内容。我能想到的最好的方法就是这样,如果你愿意的话可以这么类比 - 假设你使用CreateHandle例程打开一个文件只写,然后调用DuplicateHandle将句柄传递给另一个线程,线程将从该线程中读取文件,只有句柄重复,因此线程不必再次调用CreateHandle ...
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分:1)
DuplicateHandle
的一种可能用法是在32位进程和64位进程之间复制句柄。
注意:不能在I / O完成端口或套接字上使用。
答案 3 :(得分:1)
DuplicateHandle的另一个用途是在文件使用FileOptions.DeleteOnClose
时在多个进程中打开文件。 (如果使用文件路径打开文件,则多个进程无法打开此类文件)