在C++中调用“system”时如何抑制控制台输出

14

我正在使用C ++中的system命令调用一些外部程序,每当我使用它时,一个控制台窗口会在命令完成后打开并关闭。

如何避免打开控制台窗口?如果解决方案可以跨平台,我会很高兴。 我还希望我的程序等待命令完成。


重复但有更好答案(适用于Windows):https://dev59.com/YXI-5IYBdhLWcg3w9tdw - Steed
5个回答

6

这可能是最简单、也是最好的方法,同时您的程序在运行此命令时也不会冻结。 首先,不要忘记使用以下代码包含Windows头文件;

#include <Windows.h>

那么您需要使用以下函数来运行您的命令:
WinExec("your command", SW_HIDE); 

注意:WinExec方法已经过时十多年了。虽然它今天仍然可以正常工作,但如果不需要,请不要使用此方法。

...而不是你不想使用的方式;

system("your command");

2
考虑到WinExec自17年前就已经被弃用,我很难把它称为“最佳”方式。 - Rob Kennedy
好的,我不确定,所以我说“可能”。 - Tim Visée
1
对我来说运行得很好,即使已经被弃用,我也必须点赞,因为我搜索了几个小时。谢谢。 - Demurgos

4

听起来你在使用Windows。

在Linux(和*nix系统中),我会将对system的调用替换为分别对forkexec的调用。在Windows上,我认为有一些可以生成新进程的函数在Windows API中,请查阅文档。

当你运行shell命令和/或外部程序时,你的程序很难做到平台无关性,因为它会依赖于平台是否具有你正在运行的命令和/或外部程序。


一般而言,当使用shell命令时,你关于程序依赖特定平台的说法是正确的。然而,在这种情况下,我会确保外部程序已安装在我使用的计算机上。这不是一个简单的shell命令。关于你的回答 - 对于Windows系统可以使用CreateProcess,对于Unix系统可以使用fork+exec,但我希望更优雅地解决这个问题。 - Dana
使用CreateProcess/fork+exec有什么不优雅的地方呢?如果你将它封装在一个好的类中,你就有了一种非常优雅的启动进程的方式,而且你可以很容易地添加诸如重定向输出/输入等选项。 - stijn

3

以下是一种可以不用新建 cmd.exe 窗口来执行命令的方法。该方法基于Roland Rabien的回答MSDN,我写了一个可用的函数:

int windows_system(const char *cmd)
{
  PROCESS_INFORMATION p_info;
  STARTUPINFO s_info;
  LPSTR cmdline, programpath;

  memset(&s_info, 0, sizeof(s_info));
  memset(&p_info, 0, sizeof(p_info));
  s_info.cb = sizeof(s_info);

  cmdline     = _tcsdup(TEXT(cmd));
  programpath = _tcsdup(TEXT(cmd));

  if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info))
  {
    WaitForSingleObject(p_info.hProcess, INFINITE);
    CloseHandle(p_info.hProcess);
    CloseHandle(p_info.hThread);
  }
}

适用于所有Windows平台。调用方式与system()相同。


2
这不会返回一个整数,我建议从GetExitCodeProcess返回退出代码(标准系统返回此值)。 - brettmichaelgreen

1

嗯,CreateProcess或者ShellExecute


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接