我正在尝试编写一个程序,该程序在当前目录中从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可能无效。任何想法?
答案 0 :(得分:4)
您应该使用CreateProcess
中的句柄,而不是在PID上使用OpenProcess
。
OpenProcess
才有效。如果进程对象消失,则在调用OpenProcess
时 - 结果是带有无效参数的调用。
您使用其他实用程序获得的成功要么是由于竞争条件(可能会失败一段时间),要么是您保持子进程的原始句柄处于打开状态。
答案 1 :(得分:1)
为其他人的目的留下小费。我管理通过尝试打开以到达ERROR_INVALID_PARAMETER (87)
:
例如,当您直接从GetWindowThreadProcessId
声明结果,该结果是 identifier of the thread that created the window
,而不是其指针参数(为您提供请求的PID)。
答案 2 :(得分:0)
虽然帖子很旧:我注意到当进程存在时我得到ERROR_INVALID_PARAMETER
,但是由不同的用户和/或Windows桌面和/或终端服务器会话拥有。
奇怪的是,WTSEnumerateProcess()
函数不会受到这个错误的影响,但是要贵得多,尤其是在已经处于高负载且具有许多进程的系统上(并且调用我甚至耗尽Windows内核资源)
所以,不可能做出真实的'提供的参数无效和访问错误。我本来期望ERROR_ACCESS_DENIED
代替(但是作为常规/非提升用户调用的任务管理器仍会显示所有进程)。
看起来像Windows中的一些不一致?