重复句柄错误:error_invalid_handle

Posted

技术标签:

【中文标题】重复句柄错误:error_invalid_handle【英文标题】:DuplicateHandle error: error_invalid_handle 【发布时间】:2013-01-24 11:26:31 【问题描述】:

我正在尝试使用 DuplicateHandle 函数将句柄从 process1 传递到 process2。我使用 CreateFile 函数获取句柄:

HANDLE COMportHandle;
COMportHandle = CreateFile(TEXT("COM5"),
                           GENERIC_ALL | PROCESS_DUP_HANDLE,
                           0,
                           0,
                           OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,
                           0);

在第二个进程中,我先通过共享内存从process1获取进程ID,然后尝试复制句柄:

HANDLE pr1handle, CPH, COMportHandle;
pr1handle = OpenProcess(PROCESS_DUP_HANDLE,FALSE,process_id);
if(!DuplicateHandle(pr1handle,COMportHandle,GetCurrentProcess(),&CPH,PROCESS_DUP_HANDLE,FALSE,0))
    printf("Error: %d\n",GetLastError());

然后我得到 ERROR_INVALID_HANDLE。 进程不相关,我运行第一个打开 COM 端口,然后希望能够使用第二个进程从中读取。 有人能告诉我问题在哪里吗?

【问题讨论】:

嗯,PROCESS_DUP_HANDLE 不是文件句柄的有效访问掩码。它只对进程句柄有意义。 从不跳过错误检查,肯定是 OpenProcess() 失败了。 【参考方案1】:

在此代码中:

HANDLE pr1handle, CPH, COMportHandle;
pr1handle = OpenProcess(PROCESS_DUP_HANDLE,FALSE,process_id);
if(!DuplicateHandle(pr1handle,COMportHandle,GetCurrentProcess(),&CPH,PROCESS_DUP_HANDLE,FALSE,0))
    printf("Error: %d\n",GetLastError());

您引入了一个新的、未初始化的 COMportHandle。因此,假设这是实际代码,我一点也不惊讶 COMportHandle 无效”。您将需要从第一个进程中获取 COMportHandle 的实际值。

【讨论】:

我认为这就是 DuplicateHandle 函数的作用。如果我能以另一种方式从第一个进程中获得实际值,我根本不会使用这个函数。你可能知道如何做到这一点?我第一次尝试通过共享内存传递它,但我意识到这是不可能的,因为 HANDLE 是一个 void 指针,并且此类类型仅在它们被初始化的过程中才有意义...... 如果您阅读 DuplicateHandle 页面中的注释,它会显示“要复制的句柄。这是一个在源进程的上下文中有效的开放对象句柄。对于对象列表其句柄可以复制,请参阅以下备注部分。” - 所以你需要来自源进程的原始句柄才能复制它 - DuplicateHandle 怎么知道你想复制哪个句柄?如果您可以控制两段代码,有什么特殊原因不能使用两个线程而不是两个进程吗? “DuplicateHandle 可以由源进程或目标进程调用” 好像我误解了这一点。我认为目标进程(参数 3)可以调用 DuplicateHandle,并从源进程(参数 1)复制句柄(参数 2)并将其存储到参数 4。我想我必须找到另一种方法来做到这一点。我的第一个进程应该打开端口,而第二个进程是一个 Matlab 可执行函数,它将从 Matlab 本身调用以执行读取操作。这就是为什么我想要 2 个单独的进程。谢谢你的回答。 无论哪个进程调用 DuplicateHandle,您都必须将句柄的整数值从一个进程传递给另一个进程。在您的情况下,您需要将原始句柄的整数值从源进程传递给目标进程。您可以使用共享内存或任何数量的其他方法来执行此操作。然后目标进程可以将该整数值传递给 DuplicateHandle 以为自己创建句柄的副本。 谢谢你,Harry,根据你的建议,我成功地复制了句柄,并且还能够将它用于 ReadFile 功能! :)

以上是关于重复句柄错误:error_invalid_handle的主要内容,如果未能解决你的问题,请参考以下文章

Winforms问题-创建窗口句柄时出错[重复]

sql serve2012安装程序遇到以下错误 句柄无效 怎么办

如何从 IntPtr 句柄创建 WPF 光标 [重复]

Android Fragment句柄后退按钮按下[重复]

SQL Server消息输出上的C#句柄[重复]

swiftyJson 错误句柄