DuplicateHandle,为什么重复而不仅仅是获取?

Ton*_*ion 3 process handle

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

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

Own*_*loo 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...
}
Run Code Online (Sandbox Code Playgroud)
你能看到这个代码片段的问题吗?我们的想法是让父线程向子线程传递一个标识父线程的线程句柄.但是,父线程传递伪句柄,而不是真正的句柄.当子线程开始执行时,它将伪句柄传递给GetThreadTimes函数,这会导致子线程获得自己的CPU时间,而不是父线程的CPU时间.发生这种情况是因为线程伪句柄是当前线程的句柄 - 也就是调用函数调用的任何线程的句柄.

要修复此代码,我们必须将伪句柄转换为真正的句柄.DuplicateHandle函数(在第3章中讨论)可以进行此转换