【问题标题】:OpenProcess error 87 invalid parameterOpenProcess 错误 87 参数无效
【发布时间】: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 有什么无效的地方。有什么想法吗?

【问题讨论】:

    标签: winapi makefile getlasterror openprocess


    【解决方案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 中看起来有些不一致?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-20
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多