system()和CreateProcess()/ CreateProcessW()

deh*_*ker 4 windows external-process system createprocess

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

system( "TEST.exe <input-file> output-file" );
Run Code Online (Sandbox Code Playgroud)

我可以得到我的预期.

但是当我使用以下代码时,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(); 
} 
Run Code Online (Sandbox Code Playgroud)

哪里

FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".
Run Code Online (Sandbox Code Playgroud)

WaitForSingleObject()返回258,GetLastError()返回1813("在图像文件中找不到指定的资源类型.").

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

FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*oey 6

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

所述系统功能通过命令到命令解释器,它执行字符串作为操作系统命令.system是指定位命令解释程序文件(Windows NT中名为CMD.EXE的文件)的COMSPECPATH环境变量.如果command为NULL,则该函数只检查命令解释器是否存在.
- 文件system

这就是为什么重定向等运营商<>工作.CreateProcess实际上,这不是真正产生进程而不是执行另一个进程的shell的情况.由于重定向操作符是shell的一个功能而不是操作系统,因此您必须手动输入和输出到进程.