背景信息: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).
即使我将所有内容都推送到Windows字符串和指针中,我也做了大量的数据处理工作。所以我复制了CreateProcess()的所有修改,以便再次调用另一个外部程序:
if( !CreateProcess( "C:\\Temp\\sift.exe",
t_str2, // Arguments
...
}
//where t_str2 is ` < C:\\img1.pgm > C:\\img1.key`
基本上,一些非常相似,但所有变量名都改变了(因为我有两个调用运行串口)。这就是问题所在;这不会运行,而是打印出“无效的命令行参数:&lt; C:\ img1.pgm”。当然,这个命令在命令提示符下工作正常,但在我的代码中没有。
我将t_str2切换到其他不那么复杂的东西(因为我知道sift.exe是如何工作的),我得到了相同的结果。当我只进行筛选而不是转换时,会发生同样的事情。
问题:可能导致此问题的原因是什么?我该怎么做才能进一步调试这个问题?关于我正在使用的方法的替代方案的任何建议?任何帮助表示赞赏。我可以提供进一步的代码,但它非常直接,并且不会出现太多问题。
答案 0 :(得分:9)
您不能直接使用CreateProcess()
的命令行重定向运算符。您必须生成cmd.exe的实例并将操作符传递给它,例如:
CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...))
t_str2
为"/C C:\\Temp\\sift.exe < C:\\img1.pgm > C:\\img1.key"
的位置。可以通过阅读%COMSPEC%
环境变量来确定cmd.exe的实际路径。
答案 1 :(得分:4)
在第二个示例中,您尝试使用标准输入和重定向,这是命令行应用程序的符号。但它们不是有效的程序参数。如果你想使用重定向,你应该打开管道并手动读/写输入/输出文件。 Here您可以找到如何使用输入/输出重定向实现流程创建的示例。
答案 2 :(得分:0)
CreateProcess
有一些讨厌的陷阱,如果你还没有引用官方文档,那么Stack Exchange中较旧的答案会使这个过程有点麻烦。
CreateProcess
的参数1大部分都是可选的,这对于第一个参数来说真的很奇怪。如果您不想指定它,请使用NULL
,否则您应该阅读非常具体的 documentation,了解如何在未将参数1设置为{{1 }}。NULL
,则应用程序必须是参数2的第一部分。再次感谢雷米清除我最初答案中的奇怪行为。
此代码示例仅需要Windows上的基本VC ++编译器,并且能够在桌面上制作和存储将由记事本打开的文件。
如果这不切实际,请随意使用NULL
或其他位置放置测试文件。该应用程序将一直运行,直到您关闭notepad.exe。这也处理获取和返回退出代码。如果您不希望它在退出前无限期运行,则需要更新%temp%
行。
WaitForSingleObject