OpenProcess 错误 87 参数无效

Posted

技术标签:

【中文标题】OpenProcess 错误 87 参数无效【英文标题】:OpenProcess error 87 invalid parameter 【发布时间】:2011-02-14 01:14:56 【问题描述】:

我正在尝试编写一个程序,该程序从当前目录中的 MinGW 分发执行 make.exe,并利用其 STDOUT 数据和退出代码。我有一个句柄来处理我从中获取数据的 STDOUT,使用 CreatePipe 创建。当我在该管道上收到 ERROR_HANDLE_EOF 时,我假设该进程已退出并尝试获取其退出代码:

if(session->pid == 0) return;
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
            PROCESS_TERMINATE, TRUE, session->pid);
if(hp == NULL) 
    printf("OpenProcess(%i) failed, error: %i\n",
        session->pid, (int)GetLastError());
    return;

我的代码适用于我测试的所有其他 MinGW 实用程序(如 pwd、ls 等),我可以毫无问题地获得 STDOUT 和退出代码。但是当我在 make 上尝试时,上面的代码显示以下消息:

“OpenProcess(2032) 失败,错误:87”

我搜索了错误代码 87,它显示“参数无效”。我看不出像 2032 这样的正进程 ID 有什么无效的地方。有什么想法吗?

【问题讨论】:

【参考方案1】:

您应该使用来自CreateProcess 的句柄,而不是在PID 上使用OpenProcess

OpenProcess 仅在进程对象仍然存在时才有效。如果进程对象消失了,当您调用 OpenProcess 时 - 结果是带有无效参数的调用。

您使用其他实用程序获得的成功要么是由于竞争条件(有时可能会失败),要么是您保持子进程的原始句柄处于打开状态。

【讨论】:

【参考方案2】:

为他人的目的留下小费。我设法通过尝试打开到达ERROR_INVALID_PARAMETER (87)

一个系统进程 (0) 属于线程而非进程的 ID(参考 YatoDev's post)。

第二种情况可能是一个问题,例如直接从GetWindowThreadProcessId 声明一个结果,这是一个identifier of the thread that created the window,而不是它的指针参数(它给你请求的PID)。

【讨论】:

【参考方案3】:

虽然帖子很旧:我注意到当进程存在时我得到了ERROR_INVALID_PARAMETER,但由不同的用户和/或 Windows 桌面和/或终端服务器会话拥有。

很奇怪,WTSEnumerateProcess() 函数不会出现此错误,但代价更高,尤其是在已经承受大量进程且负载很重的系统上(并且调用我什至耗尽了 Windows 内核资源)。

因此,不可能提供“真正的”无效参数并访问错误。我本来希望ERROR_ACCESS_DENIED 代替(但是作为普通/非提升用户调用的任务管理器仍然显示所有进程)。

在 Windows 中看起来有些不一致?

【讨论】:

以上是关于OpenProcess 错误 87 参数无效的主要内容,如果未能解决你的问题,请参考以下文章

GetProcessDEPPolicy 错误 87

WSAGetLastError()的返回值

VC++ 2008,OpenProcess 总是返回错误 5(拒绝访问)

如何修复VPN 错误87:参数错误

InternetReadFile 问题(错误 87 - 参数不正确)

oracle,插入数据,to_date('13-JUL-87')-51为啥提示“无效的月份”?