Winapi OpenProcess错误87无效参数

Winapi OpenProcess错误87无效参数,winapi,makefile,getlasterror,openprocess,Winapi,Makefile,Getlasterror,Openprocess,我正试图编写一个程序,在当前目录下执行MinGW发行版中的make.exe,并利用其标准输出数据和退出代码。我有一个句柄来处理STDOUT,从中获取数据,是用CreatePipe创建的。当我在该管道上获得错误\u HANDLE\u EOF时,我假设该进程已退出,并尝试获取其退出代码: if(session->pid == 0) return; HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TE

我正试图编写一个程序,在当前目录下执行MinGW发行版中的make.exe,并利用其标准输出数据和退出代码。我有一个句柄来处理STDOUT,从中获取数据,是用CreatePipe创建的。当我在该管道上获得错误\u HANDLE\u 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有什么是无效的。有什么想法吗?

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

OpenProcess
仅当流程对象仍然存在时才起作用。当您调用
OpenProcess
时,如果流程对象已消失,则结果是使用无效参数调用


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

尽管帖子很旧:我注意到当进程存在时,我得到了
错误\u无效\u参数,但属于不同的用户和/或Windows桌面和/或终端服务器会话

奇怪的是,
WTSEnumerateProcess()
函数没有出现这种错误,但代价要高得多,尤其是在一个已经有很多进程(甚至调用my会耗尽windows内核资源)的系统上

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


Windows中是否存在一些不一致的情况?

为其他人留下提示。我试图打开以下文件,成功地到达了
错误\u无效\u参数(87)

  • 系统进程(0)
  • 属于线程而不是进程的ID(参考)
第二种情况可能是问题,例如,当您直接从中声明结果时,这是创建窗口的线程的
标识符,而不是其指针参数(为您提供请求的PID)