Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在windows c++;_C++_Windows_Visual Studio 2010_Winapi_Createprocess - Fatal编程技术网

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:是的,这是因为您得到的退出代码是
暂停
;我编辑了我答案中的最后一个片段,以便在过程中出错时,您得到的退出代码是1de>dir命令执行我使用了/c而不是/k,但是我得到了