OpenProcess错误87无效参数

时间:2011-02-14 01:14:56

标签: winapi makefile getlasterror openprocess

我正在尝试编写一个程序,该程序在当前目录中从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”

我用Google搜索错误代码87,并显示“无效参数”。我没有看到像2032这样的积极进程ID可能无效。任何想法?

3 个答案:

答案 0 :(得分:4)

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

仅当流程对象仍然存在时,

OpenProcess才有效。如果进程对象消失,则在调用OpenProcess时 - 结果是带有无效参数的调用。

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

答案 1 :(得分:1)

为其他人的目的留下小费。我管理通过尝试打开以到达ERROR_INVALID_PARAMETER (87)

  • 系统进程(0)
  • 属于线程而不是进程的ID(引用YatoDev's post)。

例如,当您直接从GetWindowThreadProcessId声明结果,该结果是 identifier of the thread that created the window ,而不是其指针参数(为您提供请求的PID)。

答案 2 :(得分:0)

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

奇怪的是,WTSEnumerateProcess()函数不会受到这个错误的影响,但是要贵得多,尤其是在已经处于高负载且具有许多进程的系统上(并且调用我甚至耗尽Windows内核资源)

所以,不可能做出真实的'提供的参数无效和访问错误。我本来期望ERROR_ACCESS_DENIED代替(但是作为常规/非提升用户调用的任务管理器仍会显示所有进程)。

看起来像Windows中的一些不一致?