system()和CreateProcess()/CreateProcessW()

6

我想在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程序时正常工作(打印hello并根据以下数字确定的时间间隔睡眠一些秒数,然后退出)。

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

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

FullPathToExe是一个字符串还是宽字符串? - zdan
这是一个wstring。我认为变量类型没问题,因为代码在我的*.exe中运行良好。我想知道参数中的“<”/“>”是否有问题? - dehiker
标题应更改为“输入/输出重定向:system() vs. CreateProcess()”,但我无法编辑它。此外,<input-file> output-file中的间距是不相关的,因此具有误导性。字符<>是前缀,但OP的间距暗示它们是括号。不会产生误导的间距是:<output-file >input-file。 - 7vujy0f0hy
3个回答

6

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

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

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


非常感谢您的解释。我现在找到了解决方案,太棒了! - dehiker

3

我会按照创建进程和命令行参数所告诉我的去做,并解决问题!感谢大家的关注!

为了方便起见,以下是答案的引用:

You cannot use command-line redirection operators with CreateProcess() directly. You have to spawn an instance of cmd.exe and pass the operators to it instead, eg:

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

Where t_str2 is "/C C:\Temp\sift.exe < C:\img1.pgm > C:\img1.key". The actual path to cmd.exe can be determined by reading the %COMSPEC% environment variable.


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接