【发布时间】:2010-10-23 14:42:09
【问题描述】:
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
到
hProcess= 152
然后我通过命名管道将此进程句柄传递给第一个进程。 在第一个进程(事件句柄有效)中,我调用 Duplicate handle:
DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)
不幸的是我得到了错误:
DuplicateHandle hPipeFCGI GetLastError= 6 - 句柄无效。
进一步测试(替换 hFirstProcess)显示无效的是 hSecondProc!??
大谜。
【问题讨论】:
-
我不知道你的布局,但你想考虑使用命名事件吗?这可能比尝试复制句柄更容易。