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如何工作),我得到了相同的结果.当我只进行筛选而不是转换时,会发生同样的事情.
问题:可能导致此问题的原因是什么?我该怎么做才能进一步调试这个问题?关于我正在使用的方法的替代方案的任何建议?任何帮助表示赞赏.我可以提供进一步的代码,但它非常直接,并没有太多可能出错.
您不能直接使用命令行重定向运算符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的实际路径.