在C ++中调用“system”时取消控制台

时间:2009-11-26 09:08:39

标签: c++ console system system-calls

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

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

5 个答案:

答案 0 :(得分:5)

这可能是最简单也许是最好的方法,这也会使你的程序在运行此命令时不会冻结。 首先,不要忘记使用;

包含Windows标头
#include <Windows.h>

然后您需要使用以下函数来运行命令;

WinExec("your command", SW_HIDE); 

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

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

system("your command");

答案 1 :(得分:3)

听起来你正在使用Windows。

在Linux(以及一般的* nix)上,我将分别通过调用systemfork替换对exec的调用。在Windows上,我认为在Windows API中有一些spawn-a-new-process函数 - 请参阅文档。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

ERRM。 CreateProcessShellExecute

答案 4 :(得分:1)

这是一种在没有新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()一样打电话。