我想在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".
有什么想法吗?谢谢你的任何提示!
答案 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 获取流程的退出代码。