system()和CreateProcess()/ CreateProcessW()

时间:2012-04-02 03:57:25

标签: windows system createprocess external-process

我想在C程序中执行TEST.exe。我用的时候用

system( "TEST.exe <input-file> output-file" );

我能得到我的期望。

但是,当我使用以下代码时,CreateProcessW()无法正常工作(请参阅How do I run an external program?):

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), 
    pwszParam, 0, 0, false, 
    CREATE_DEFAULT_ERROR_MODE, 0, 0, 
    &siStartupInfo, &piProcessInfo) != false) 
{ 
    /* Watch the process. */ 
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess,  (SecondsToWait * 1000)); 
    iReturnVal = GetLastError(); 
} 
else 
{ 
    /* CreateProcess failed */ 
    iReturnVal = GetLastError(); 
} 

,其中

FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".

WaitForSingleObject()返回258,GetLastError()返回1813(&#34;在图像文件中找不到指定的资源类型。&#34;)。

此外,上面的CreateProcessW()代码在我运行自己的HelloProcess.exe时打印正常(打印问候,并按照以下数字确定睡眠时间,然后退出。)

FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".

有什么想法吗?谢谢你的任何提示!

3 个答案:

答案 0 :(得分:6)

system实际上产生了一个运行命令的cmd实例:

  

system 函数将命令传递给命令解释器,命令解释器将字符串作为操作系统命令执行。 system 是指 COMSPEC PATH 环境变量,它们定位命令解释程序文件(Windows NT中名为CMD.EXE的文件)。如果 command 为NULL,则该函数只检查命令解释器是否存在    - Documentation of system

这就是<>等重定向运算符的工作原理。 CreateProcess实际上只是生成一个进程而不是执行另一个进程的shell而不是这种情况。由于重定向操作符是shell的一个功能而不是操作系统,因此您必须手动输入和输出该过程。

答案 1 :(得分:2)

我做的是CreateProcess and command line arguments 告诉我要做,并解决问题!谢谢你们的关注!

为方便起见,这里是答案的引用:

  

您不能将命令行重定向运算符与CreateProcess()一起使用   直。您必须生成cmd.exe的实例并传递   相反,运营商,例如:

CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...)) 
     

其中   t_str2是“/ C C:\ Temp \ sift.exe&lt; C:\ img1.pgm&gt; C:\ img1.key”。该   可以通过读取%COMSPEC%来确定cmd.exe的实际路径   环境变量。

答案 2 :(得分:0)

WaitForSingleObject()返回等待结果,而不是退出代码。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

258是WAIT_TIMEOUT。您应该重试此错误代码,直到获得返回值0(WAIT_OBJECT_0)或其他一些错误。

在此之后,使用GetExitCodeProcess https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx 获取流程的退出代码。