14

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

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

4

5 回答 5

6

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

#include <Windows.h>

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

WinExec("your command", SW_HIDE); 

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

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

system("your command");
于 2012-03-13T14:30:55.000 回答
3

听起来您正在使用Windows。

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

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

于 2009-11-26T09:15:13.930 回答
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()

于 2017-03-10T22:34:31.333 回答
1

嗯。CreateProcessShellExecute

于 2009-11-26T09:45:40.233 回答
0

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

于 2009-11-26T09:38:35.980 回答