CreateProcess和命令行参数

use*_*275 4 c++ windows createprocess command-line-arguments

背景信息: Windows 7,Visual C++ 2010 Express

问题: CreateProcess()通过'无效的命令行参数'继续返回

说明:我正在编写一段使用Windows API的CreateProcess调用外部程序的代码.到目前为止,我已接到使用一个外部程序的电话:

if( !CreateProcess( "C:\\Temp\\convert.exe",
    t_str,        // Arguments
    ...
}
//where t_str is " C:\\img1.jpeg C:\\img1.pgm" (ImageMagick if you're wondering). 
Run Code Online (Sandbox Code Playgroud)

即使我将所有数据都推送到Windows字符串和指针中,我也可以完美地工作.所以我复制了CreateProcess()的所有修改,以便对另一个外部程序进行另一次调用:

 if( !CreateProcess( "C:\\Temp\\sift.exe",
     t_str2,        // Arguments
     ...
 }
 //where t_str2 is ` < C:\\img1.pgm > C:\\img1.key`
Run Code Online (Sandbox Code Playgroud)

基本上,一些非常相似,但所有变量名称都已更改(因为我有两个调用运行串行).这就是问题所在; 这不会运行,而是打印出"无效的命令行参数:<C:\ img1.pgm".当然,这个命令在命令提示符下工作正常,但在我的代码中没有.

我将t_str2切换到其他一些不太复杂的东西(因为我知道sift.exe如何工作),我得到了相同的结果.当我只进行筛选而不是转换时,会发生同样的事情.

问题:可能导致此问题的原因是什么?我该怎么做才能进一步调试这个问题?关于我正在使用的方法的替代方案的任何建议?任何帮助表示赞赏.我可以提供进一步的代码,但它非常直接,并没有太多可能出错.

Rem*_*eau 9

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

CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...))
Run Code Online (Sandbox Code Playgroud)

哪里t_str2"/C C:\\Temp\\sift.exe < C:\\img1.pgm > C:\\img1.key".可以通过读取%COMSPEC%环境变量来确定cmd.exe的实际路径.