winapi - 在 Windows 上替代 system() 和 _popen()

这与: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() 的替代方案?

谢谢!

最佳答案

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

但是 CreateProcess() 使用起来并不那么简单 - 特别是当您想要获取进程的输出或写入进程的输入时。

CreateProcess() 肯定会处理包含空格字符的文件名(只要按照您的方式将它们写在引号中)。

https://stackoverflow.com/questions/535043/

相关文章:

iphone - 更改 UIImageView 动画速度

spring - 基于 spring 的网络应用程序中的父上下文

php - 使用 PHP 的 DOM API 递归添加子项

wcf - 具有自定义绑定(bind)的 SSL WCF

php soap 客户端 : wsdl vs. 非 wsdl - 哪个更快?

oracle - 从 oracle db 截断表时出错

Django 模型继承 - 我可以更改模型类型吗?

java - Java 或 .NET 的跨语言配置

web-services - SoapActionEndpointMapping在Spring-ws

visual-studio - 从 Jamfiles 构建 Visual Studio 项目?