【问题标题】:Suppress console when calling "system" in C++在 C++ 中调用“系统”时禁止控制台
【发布时间】:2010-12-20 14:56:50
【问题描述】:

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

如何避免打开控制台窗口?如果解决方案可以独立于平台,我会很高兴。我还想让我的程序等到命令完成。

【问题讨论】:

标签: c++ console system system-calls


【解决方案1】:

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

#include <Windows.h>

那么你需要使用下面的函数来运行你的命令;

WinExec("your command", SW_HIDE); 

注意; WinExec 方法已被弃用十多年。不过,它今天仍然可以正常工作。如果不需要,您不应使用此方法。

...而不是您不想想要使用的方式;

system("your command");

【讨论】:

  • 我很难称 WinExec 为“最佳”方式,因为它已被弃用超过 17 年。
  • 好吧,我不确定,所以我说也许
  • 对我来说工作得很好,即使被弃用,我也不得不投票,因为我搜索了几个小时。谢谢
【解决方案2】:

听起来你正在使用 Windows。

在 Linux(和一般的 *nix)上,我将分别调用 system 替换为调用 forkexec。在 Windows 上,我认为 Windows API 中有某种 spawn-a-new-process 函数——请参阅文档。

当您运行 shell 命令和/或外部程序时,您的程序很难独立于平台,因为它取决于具有您正在运行的命令和/或外部程序的平台。

【讨论】:

  • 一般来说,在使用 shell 命令时程序依赖于平台是正确的。但是,在这种情况下,我要确保在我使用的机器上安装了外部程序。这不是一个简单的 shell 命令。关于您的回答 - 可以对 windows 使用 CreateProcess,对 unix 使用 fork+exec,但我希望能更优雅地解决这个问题。
  • CreateProcess/fork+exec 有什么不好的地方?如果你将它包装在一个不错的类中,你就有一种非常优雅的方式来启动进程,而且你可以轻松添加重定向输出/输入等选项。
【解决方案3】:

这是一种无需新的cmd.exe 窗口即可执行命令的方法。基于Roland Rabien's answerMSDN,我写了一个工作函数:

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()

【讨论】:

  • 这个不返回int,我建议从GetExitCodeProcess返回退出码(std系统返回这个值)
【解决方案4】:

嗯。 CreateProcessShellExecute

【讨论】:

    【解决方案5】:

    exec() 看起来完全独立于平台,因为它是 POSIX。在 Windows 上,它是 _exec() 而在 unix 上是 exec():见 http://msdn.microsoft.com/en-us/library/431x4c1w(VS.71).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多