4

我想在 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(“图片文件中找不到指定的资源类型”)。

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

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

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

4

3 回答 3

6

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

system函数将命令传递给命令解释器,命令解释器将字符串作为操作系统命令执行。system指的是COMSPECPATH环境变量,它们定位命令解释器文件(在 Windows NT 中名为 CMD.EXE 的文件)。如果command为 NULL,该函数只检查命令解释器是否存在。
—<a href="http://msdn.microsoft.com/en-us/library/277bwbdz.aspx" rel="noreferrer">文档system

这就是重定向运算符(例如<and )>起作用的原因。这不是CreateProcess真正只是产生一个进程而不是执行另一个进程的 shell 的情况。由于重定向运算符是 shell 的一项功能,而不是操作系统的功能,因此您必须手动对进程进行输入和输出。

于 2012-04-02T08:05:47.183 回答
3

我按照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% 环境变量来确定。

于 2012-04-02T12:11:09.143 回答
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 获取进程的退出代码。

于 2016-01-14T01:19:34.977 回答