Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DuplicateHandle错误:错误\u无效\u句柄_C++_Windows_Handle - Fatal编程技术网

C++ DuplicateHandle错误:错误\u无效\u句柄

C++ DuplicateHandle错误:错误\u无效\u句柄,c++,windows,handle,C++,Windows,Handle,我试图使用DuplicateHandle函数将句柄从process1传递到process2。我使用CreateFile函数获取句柄: HANDLE COMportHandle; COMportHandle = CreateFile(TEXT("COM5"), GENERIC_ALL | PROCESS_DUP_HANDLE, 0, 0,

我试图使用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());
然后我得到错误句柄。 这些进程并不相关,我运行第一个进程打开COM端口,然后希望能够使用第二个进程从中读取。 有人能告诉我捕获物在哪里吗?

在此代码中:

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函数就是这么做的。如果我能以另一种方式从第一个进程获得实际值,我就不会使用这个函数。你知道怎么做吗?我第一次尝试通过共享内存传递它,但我意识到这是不可能的,因为句柄是一个空指针,这样的类型只有在初始化它们的过程中才有意义……如果你阅读页面中的注释来查找DuplicateHandle,它说“要复制的句柄。这是一个在源进程上下文中有效的开放对象句柄。有关可复制句柄的对象列表,请参见以下备注部分。“-因此您需要源进程的原始句柄才能复制它-否则DuplicateHandle如何知道要复制哪个句柄?如果您同时控制这两段代码,有什么特殊原因不能使用两个线程而不是两个进程吗?“DuplicateHandle可以由源进程或目标进程调用”似乎我误解了这一点。我认为目标进程(参数3)可以调用DuplicateHandle,从源进程(参数1)复制一个句柄(参数2)并将其存储到参数4。我想我必须找到另一种方法来做到这一点。我的第一个进程应该是打开端口,而第二个进程是一个Matlab可执行函数,它将从Matlab本身调用以执行读取操作。这就是为什么我想要两个独立的进程。感谢您的回答。无论哪个进程调用DuplicateHandle,您都必须将句柄的整数值从一个进程传递到另一个进程。在本例中,需要将原始句柄的整数值从源进程传递到目标进程。您可以使用共享内存或任何其他方法来实现这一点。然后,目标进程可以将该整数值传递给DuplicateHandle,以便为自己创建句柄的副本。谢谢Harry,使用您的建议,我成功地复制了句柄,并且还可以将其用于ReadFile函数!:)嗯,进程重复句柄不是文件句柄的有效访问掩码。它只对进程句柄有意义。千万不要跳过错误检查,OpenProcess()肯定失败了。