gpt4 book ai didi

c++ - DuplicateHandle(),在第一个或第二个过程中使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:14 26 4
gpt4 key购买 nike

Windows API DuplicateHandle() http://msdn.microsoft.com/en-us/library/ms724251(VS.85).aspx需要复制对象句柄以及原始进程和要在其中使用重复句柄的其他进程的句柄。

我假设如果我有两个不相关的进程,我可以在任何一个中调用 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() 转换它的句柄

hProc伪=4294967295

h进程= 152

然后我通过命名管道将这个进程句柄传递给第一个进程。在第一个过程中(事件句柄有效的地方)我调用重复句柄:

DuplicateHandle( hFirstProcess, hEvent, hSecondProc, hDupEvent, DUPLICATE_SAME_ACCESS, 0, 0)

不幸的是我得到了错误:

DuplicateHandle hPipeFCGI GetLastError= 6 - 句柄无效。

进一步测试(替换为 hFirstProcess)表明无效的是 hSecondProc!??

大谜团。

最佳答案

使用 named pipemailslots对于 IPC,这应该可以可靠地满足您的目的。如果需要等待,请使用命名等待句柄。

否则,我会选择在第二个进程中执行 DuplicateHandle 以正确设置句柄所有权。

关于c++ - DuplicateHandle(),在第一个或第二个过程中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/819710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com