替代Windows上的system()和_popen()

时间:2009-02-11 01:09:17

标签: winapi

这与:How do I read the results of a system() call in C++?

有关

我正在尝试完全相同的事情,只是我的程序需要将'带空格的多个参数'传递给命令。我需要命令行输出和进程的退出代码。

示例:使用Textpad的示例。我正在使用的应用程序在stdout上打印东西。


string command1 = "\"C:\Program Files\TextPad 5\Textpad.exe\" C:\readme0.txt";
string command2 = "\"C:\Program Files\TextPad 5\Textpad.exe\" \"C:\read me2.txt\"";
cout << system(command1.c_str()) << endl;
cout << system(command1.c_str()) << endl;


输出:

0 “C:\ Program”未被识别为内部或外部命令, 可操作程序或批处理文件。

1

第一次调用系统传递,第二次调用因上述错误而失败。 Windows中的_popen在Windows上的工作方式类似,因此没有任何帮助。我可以轻松地在Linux上执行此操作,因为我可以在参数中转义空格而无需使用引号。

另一种方法是编写大量非跨平台代码,如下所示: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx

但是如果我想避免这种情况,Windows上有system()和_popen()的替代方法吗?

谢谢!

6 个答案:

答案 0 :(得分:2)

_popen()和system()使用的最低级别Windows API函数是CreateProcess()。

然而,CreateProcess()并不是那么简单 - 特别是当你想让进程输出或写入进程输入时。

CreateProcess()肯定会使用包含空格字符的文件名(只要它们用你的方式写成引号)。

答案 1 :(得分:0)

以下解决了路径问题中的空格。然而,捕获命令的输出很多更难:

#include <string>
#include <cstdlib>
using namespace std;

int main() {
    string cmd = "\"c:\\program files\\notepad++\\notepad++.exe\"";
    system( cmd.c_str() );
    return 0;
}

答案 2 :(得分:0)

我这样做(注意 - 这是VB.NET代码),所以我可以将命令的输出写入我的日志文件(它包含在RunCommand()方法中):

 Try
    Dim myprocess As New Process()
    myprocess.StartInfo.FileName = "C:\Program Files\TextPad 5\Textpad.exe"
    myprocess.StartInfo.RedirectStandardOutput = True
    myprocess.StartInfo.UseShellExecute = False

    ' inArgs are the arguments on the command line to the program
    myprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    myprocess.StartInfo.Arguments = "C:\readme0.txt"

    ' the dir to set as default when the program runs
    Then myprocess.StartInfo.WorkingDirectory = "C:\Program Files\TextPad 5\"

    myprocess.Start()

    ' grab a reader to the standard output of the program
    procReader = myprocess.StandardOutput()

    ' read all the output from the process
    While (Not procReader.EndOfStream)
       procLine = procReader.ReadLine()

       ' write the output to my log
       writeNotes(procLine)
    End While

    procReader.Close()

 Catch ex As Exception
    ' Write the error to my log
    writeErrors("Couldn't execute command "C:\Program Files\TextPad 5\Textpad.exe", ex)
 End Try

答案 3 :(得分:0)

许多实用程序库采用了大量非可移植代码并将其包装在便携式接口中。有关示例,请参阅Qt的QProcess。

答案 4 :(得分:-1)

我认为ShellExecute()正是您所寻找的。

答案 5 :(得分:-1)

永远不要在Windows中使用system()! 只需重定向i / o句柄。