【发布时间】:2016-10-25 08:40:20
【问题描述】:
我正在使用 Createprocess 在 cmd 中运行命令,并且我正在尝试使用 GetExitCodeProcess() 获取该特定命令执行的退出代码。
如果命令窗口打开并且我尝试GetExitCodeProcess(),那么我总是得到259(STILL_ACTIVE) 返回码。如果我尝试使用TerminateProcess() 终止进程,那么我会得到退出代码,即我发送的值以终止进程。
下面是我的代码:
STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
BOOL b = CreateProcess("C:\\Windows\\System32\\cmd.exe","/k dir",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
TerminateProcess(pi.hProcess,1);
DWORD dwExitCode = 0;
::GetExitCodeProcess(pi.hProcess, &dwExitCode);
当我将/k dir 作为命令传递时,我应该得到非零错误代码,如果我传递/k dirancbdf(任何不存在的命令),我应该得到零错误代码。
使用Terminateprocess 的另一个原因是我想根据该命令的成功/失败隐藏/显示命令提示符。
【问题讨论】:
-
您知道
TerminateProcess会尝试实际终止进程,即使它还没有完成?而且,它是异步的!请阅读链接参考以获取更多信息。 -
我不清楚您要在这里实现什么,但您可能应该使用
/c而不是/k并省略CREATE_NEW_CONSOLE标志。如果您还没有控制台,您可能还需要先创建一个控制台。 -
@Someprogrammerdude 是的,我知道。如果我不使用 TerminateProcess 并尝试获取退出代码,我将始终得到 259(STILL_ACTIVE)。有什么替代方法?
-
这是获取目录列表的一种非常糟糕的方式。
-
如果你要运行的实际命令是一个外部命令——一个应用程序——那么你可以直接运行它而不是通过
cmd.exe。
标签: c++ windows visual-studio-2010 winapi createprocess