Process DuplicateHandle,为什么要复制而不只是获取?

Process DuplicateHandle,为什么要复制而不只是获取?,process,handle,Process,Handle,为什么一个进程要从Win32API调用DuplicateHandle,并从另一个进程获取它,而不是仅仅获取某个对象本身的句柄 调用DuplicateHandle或其他东西有什么好处吗?请参阅MSDN中关于“”用法的说明。我能想到的最好的方法是这样,如果你愿意的话,一个类比-假设你使用CreateHandle例程打开一个文件,只用于写,然后你调用DuplicateHandle将句柄传递到另一个线程,线程将在其中读取文件,只有句柄被复制,因此线程不必再次调用CreateHandle…Duplicat

为什么一个进程要从Win32API调用DuplicateHandle,并从另一个进程获取它,而不是仅仅获取某个对象本身的句柄


调用DuplicateHandle或其他东西有什么好处吗?

请参阅MSDN中关于“”用法的说明。我能想到的最好的方法是这样,如果你愿意的话,一个类比-假设你使用CreateHandle例程打开一个文件,只用于写,然后你调用DuplicateHandle将句柄传递到另一个线程,线程将在其中读取文件,只有句柄被复制,因此线程不必再次调用CreateHandle…

DuplicateHandle的一个可能用途是在32位进程和64位进程之间复制句柄


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

您可以在“Microsoft Windows编程应用程序”的第6.8章中找到答案

获得自我认同感
有时,您可能需要获取线程的真实句柄,而不是伪句柄。我所说的“real”是指一个明确标识唯一线程的句柄。检查以下代码: 你能看到这个代码片段的问题吗?其思想是让父线程向子线程传递一个识别父线程的线程句柄。但是,父线程传递的是伪句柄,而不是真正的句柄。当子线程开始执行时,它将伪句柄传递给GetThreadTimes函数,这将导致子线程获得自己的CPU时间,而不是父线程的CPU时间。发生这种情况是因为线程伪句柄是当前线程的句柄,也就是说,是进行函数调用的线程的句柄。

要修复此代码,必须将伪句柄转换为实句柄。DuplicateHandle函数(在第3章中讨论)可以完成此转换
DuplicateHandle的另一个用途是在文件使用
FileOptions.DeleteOnClose
时在多个进程中打开文件。(如果使用文件路径打开该文件,则无法通过多个进程打开该文件)


请参见我在

上的答案,为什么要调用DuplicateHandle,而不是像通常那样仅获取对象上的句柄?
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...
}