Windows API DuplicateHandle() http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx 需要复制对象句柄以及原始进程和另一个进程的句柄你想使用重复的句柄。
我假设如果我有两个 UNRELATED 进程,只要我有所需的句柄可用,我可以在其中一个中调用 DuplicateHandle() 吗?
我的问题是关于使用管道在两个进程之间进行通信以通过事件实现这一点。
在第一个过程中我 CreateEvent()。现在我想在第二个过程中使用 WaitForSingleObject() 。
如果我尝试在第一个进程中复制句柄,我需要先通过管道将第二个进程句柄发送到第一个进程,复制句柄然后将句柄发送到第二个进程?
或者,我可以首先将第一个进程句柄和事件句柄发送到第二个进程,然后在那里复制它。
我有理由选择其中一个吗?
要添加一个皱纹,事件句柄实际上是从实际调用第一个进程(这是一个 CGI 应用程序)的父进程继承的。如果该事件句柄是使用 HANDLE_DO_NOT_DUPLICATE (类似的东西)创建的,那么我实际上可以使用 DuplicateHandle() 为第二个进程复制它吗?
回复:
好吧,我可以在第一个进程中创建一个新的 NAMED 事件,并按照建议在第二个进程中找到它,但是我试图复制在第一个进程的父进程中创建的事件并将其转发给第二个进程。此事件不是命名事件,因此我需要使用 DuplicateHandle()。
我正在为 IPC 使用管道。我意识到 DuplicateHandle() 必须在第一个进程中调用,因为事件句柄在发送到第二个进程时脱离了上下文。
hProcPseudo = GetCurrentProcess()
//Then call either:
lpRealHandle = OpenProcess( PROCESS_DUP_HANDLE, 0, hProcPseudo )
//This fails with GetLastError= 87 - The parameter is incorrect ???
// same thing with PROCESS_ALL_ACCESS ??
//OR
lRet = DuplicateHandle( hProcPseudo, hProcPseudo, hProcPseudo, lpRealHandle, DUPLICATE_SAME_ACCESS, 0, 0 )
//then I can Duplicate my Event Handle in the first thread with:
lRet = DuplicateHandle( hLocalProcess, hEvent, lpRealHandle, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
第二个过程使用上面详细说明的 DuplicateHandle() 转换其句柄
hProcPseudo= 4294967295
至
h进程= 152
然后我通过命名管道将此进程句柄传递给第一个进程。在第一个过程(事件句柄有效)中,我调用 Duplicate handle:
DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
不幸的是,我得到了错误:
DuplicateHandle hPipeFCGI GetLastError= 6 - 句柄无效。
进一步的测试(替换 hFirstProcess)显示是 hSecondProc 无效!??
大奥秘。