system()和CreateProcess()/ CreateProcessW()

我想在C程序中执行一个TEST.exe。 当我使用

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

我可以得到我的预期。

但是,当我使用下面的代码时,CreateProcessW()无法正常工作(请参阅如何运行外部程序? ):

 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(“在图像文件中找不到指定的资源types”)。

此外,上面的CreateProcessW()代码工作正常,当我运行我自己的HelloProcess.exe(打印你好,并hibernate几秒钟确定下面的数字,然后退出)与

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

有任何想法吗? 感谢任何提示!

Solutions Collecting From Web of "system()和CreateProcess()/ CreateProcessW()"

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

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

这就是为什么重定向操作符如<>工作的原因。 对于CreateProcess ,情况并非如此,它只是产生一个进程而不是执行另一个进程的shell。 由于重定向操作符是shell的一个功能,而不是操作系统,所以您必须手动输入并输出到进程。

我做什么CreateProcess和命令行参数告诉我做,并解决问题! 谢谢你们的关注!

为了您的方便,下面是答案的引用:

您不能直接使用带有CreateProcess()的命令行重定向操作符。 你必须产生一个cmd.exe的实例,并将运算符传递给它,例如:

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

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

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获取进程的退出代码。