C++ 如何在windows c++;
我使用C++ 如何在windows c++;,c++,windows,visual-studio-2010,winapi,createprocess,C++,Windows,Visual Studio 2010,Winapi,Createprocess,我使用Createprocess在cmd中运行命令,并尝试使用GetExitCodeProcess()获取特定命令执行的退出代码 如果命令窗口打开,我尝试GetExitCodeProcess(),那么我会得到259(仍然处于活动状态)始终返回代码。如果我尝试使用TerminateProcess()终止进程,那么我会得到exit code,即我发送用于终止进程的值 下面是我的代码: STARTUPINFO si; ZeroMemory(&si,sizeof(START
Createprocess
在cmd中运行命令,并尝试使用GetExitCodeProcess()
获取特定命令执行的退出代码
如果命令窗口打开,我尝试GetExitCodeProcess()
,那么我会得到259(仍然处于活动状态)
始终返回代码。如果我尝试使用TerminateProcess()
终止进程,那么我会得到exit code,即我发送用于终止进程的值
下面是我的代码:
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
的另一个原因是我想根据该命令的成功/失败隐藏/显示命令提示符。您正在将选项/k
传递到cmd.exe
,这意味着您希望shell在执行命令dir
后保持活动状态。这样,运行该命令的进程将永远不会结束,当查询GetExitCodeProcess()
(表示进程仍在运行)时,您将始终处于活动状态
如果需要dir
命令的退出代码,则应使用选项/c
(以便cmd.exe
在执行命令dir
后结束)。此外,在查询GetExitCodeProcess()
之前,您应该使用WaitForSingleObject()
等待进程结束,因为CreateProcess()
将在创建进程后立即返回(它不会等待进程结束)。在这种情况下,无需调用TerminateProcess()
:可以从getexitdeprocess()
获得dir
命令返回状态
如果希望在发生错误时控制台保持打开状态,可以使用以下语法:
CreateProcessA("C:\\Windows\\System32\\cmd.exe","/c dir || pause && exit 1",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
其中,
|
确保只有在dir
命令失败时才执行暂停
命令,并且&
确保在出现此类错误时输出退出代码1。您正在将选项/k
传递到cmd.exe
,这意味着您希望shell在执行命令dir
后保持活动状态。这样,运行该命令的进程将永远不会结束,当查询GetExitCodeProcess()
(表示进程仍在运行)时,您将始终处于活动状态
如果需要dir
命令的退出代码,则应使用选项/c
(以便cmd.exe
在执行命令dir
后结束)。此外,在查询GetExitCodeProcess()
之前,您应该使用WaitForSingleObject()
等待进程结束,因为CreateProcess()
将在创建进程后立即返回(它不会等待进程结束)。在这种情况下,无需调用TerminateProcess()
:可以从getexitdeprocess()
获得dir
命令返回状态
如果希望在发生错误时控制台保持打开状态,可以使用以下语法:
CreateProcessA("C:\\Windows\\System32\\cmd.exe","/c dir || pause && exit 1",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
其中,
|
确保只有在dir
命令失败时才执行暂停
命令,并且和&
确保在出现此类错误时输出退出代码1。您知道这将尝试实际终止进程,即使它尚未完成?而且,它是异步的!请阅读链接参考以了解更多信息。我不清楚您在这里想要实现什么,但您可能应该使用/c
,而不是/k
,并省略创建新控制台
标志。如果您还没有控制台,您可能还需要先创建控制台。@Someprogrammerdude是的,我知道。如果我不使用TerminateProcess并尝试获取退出代码,我将始终获得259(仍处于活动状态)。还有什么办法呢?这是一种很糟糕的获取目录列表的方法。如果您想要运行的实际命令是一个外部命令-一个应用程序-那么您可以直接运行它,而不是通过cmd.exe
。您知道这将尝试实际终止进程,即使它尚未完成?而且,它是异步的!请阅读链接参考以了解更多信息。我不清楚您在这里想要实现什么,但您可能应该使用/c
,而不是/k
,并省略创建新控制台
标志。如果您还没有控制台,您可能还需要先创建控制台。@Someprogrammerdude是的,我知道。如果我不使用TerminateProcess并尝试获取退出代码,我将始终获得259(仍处于活动状态)。还有什么替代方法呢?这是一种获取目录列表的非常糟糕的方法。如果您想要运行的实际命令是一个外部命令-一个应用程序-那么您可以直接运行它,而不是通过cmd.exe
。我使用了/c而不是/k,但是我得到了“/c dir”的0个退出代码和“/c dirabc”的1个退出代码(任何错误的命令)。根据GetExitCodeProcess的文档,我认为我应该获得非零值来表示成功。不,惯例是零的退出代码表示成功,非零的退出代码表示失败-尽管这只是一个惯例,而不是一条规则,并且取决于程序员的突发奇想。(例如,对于robocopy
,任何小于4的退出代码都表示成功。)@伯劳鸟谢谢。我也使用了WaitForSingleObject,但我也得到了与此相同的退出代码。@DeepShah:如果您希望控制台在出错时保持打开状态,请参阅我的最后一个edit@DeepShah:是的,这是因为您得到的退出代码是暂停
;我编辑了我答案中的最后一个片段,以便在