【发布时间】:2021-04-22 08:32:30
【问题描述】:
我遇到了 DuplicateHandle (Win32) 的问题。我尝试复制命名管道句柄,但总是收到错误 183“文件已存在”。我不明白这个错误信息,因为我尝试创建一个文件句柄的副本,而新的文件句柄以前不存在。 (是否需要覆盖起始值?)这是我的电话:
return DuplicateHandle (MeshellProcessHandle, sourcehandle, HelperProcess, targethandle, 0, TRUE, DUPLICATE_SAME_ACCESS) != 0;
为了理解我在做什么,我必须更广泛地解释一下:我正在为命令行程序 cmd.exe 开发一个方便的编辑器前端。这个项目已经在对 Win32 非常熟悉的 OS/2 操作系统上运行良好,因为从历史的角度来看,这两个操作系统是一起开发的,直到一年前完成,微软和 IBM 走了不同的路。 这个程序的实现非常棘手:有一个窗口前端编辑器程序。该程序为 stderr、stdout 和 stderr 创建命名管道,但从相反的角度来看(cmd.exe 的输出是编辑器的输入)。由于不同会话之间的通信有限,我不得不编写一个“cmd 帮助程序”,它是一个小型命令行程序,包含多个 API 调用并与 cmd.exe 程序在同一个会话中运行。助手通过命令行参数获取编辑器进程 ID,并打开由窗口编辑器程序创建的现有管道,然后将 stdin/stdout/stderr 重定向到管道。助手通过“OpenProcess”API 调用从编辑器进程 ID 中获取编辑器的进程句柄。然后助手执行 cmd.exe,它自动继承 stdin/stdout/stderr 句柄,现在 cmd.exe 写入和读取管道。 另一种选择是在不使用 DuplicateHandle 的情况下将完整的管道名称解析为 cmd.exe,但我希望尽可能接近我的解决方案,该解决方案已经在 OS/2 操作系统上运行良好。
【问题讨论】:
-
您可能在错误的时间致电
GetLastError。我怀疑这个 api 返回的STATUS_OBJECT_NAME_COLLISION -
不要解释(你认为)你做了什么。改为显示minimal reproducible example。
-
是的,如果我在 API 调用后立即使用 GetLastError(),我会得到另一个结果。现在显示错误消息 5 Access denied。我在窗口主程序中的 API 调用中添加了 CreateNamedPipe SECURITY_ATTRIBUTES.bInheritHandle = TRUE,但是应该将标准输入/输出重定向到现有命名管道的助手程序中的 DuplicateHandle 调用仍然显示错误 5。有什么想法吗?
-
我还没有解决这个问题。我假设已经单独启动的帮助程序仍然没有复制命名管道文件句柄的权限。
标签: windows duplicates named-pipes handle