调用“时抑制控制台”;系统“;在C++; < >我使用C++中的系统> /Cuff>命令调用一些外部程序,每当我使用它时,控制台窗口在命令完成后打开和关闭。p>

调用“时抑制控制台”;系统“;在C++; < >我使用C++中的系统> /Cuff>命令调用一些外部程序,每当我使用它时,控制台窗口在命令完成后打开和关闭。p>,c++,console,system,system-calls,C++,Console,System,System Calls,如何避免打开控制台窗口?如果解决方案能够独立于平台,我会很高兴。我还希望我的程序等待命令完成。听起来你在使用windows 在Linux上(通常是*nix),我将分别用对fork和exec的调用替换对system的调用。在windows上,我认为windows API中有一些生成新进程的函数。请参阅文档 当您运行shell命令和/或外部程序时,您的程序很难独立于平台,因为它将取决于运行命令和/或外部程序的平台。exec()与POSIX相比,看起来非常独立于平台。在windows上是_exec()

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

听起来你在使用windows

在Linux上(通常是*nix),我将分别用对
fork
exec
的调用替换对
system
的调用。在windows上,我认为windows API中有一些生成新进程的函数。请参阅文档


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

exec()与POSIX相比,看起来非常独立于平台。在windows上是_exec(),而在unix上是exec():请参见
CreateProcess
ShellExecute

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

#include <Windows.h>
注;
WinExec
方法已经被弃用了十多年。不过,它今天仍然很好用。如果不需要,则不应使用此方法

。。。而不是你不想用的方式

system("your command");

这里有一种在没有新的
cmd.exe
窗口的情况下执行命令的方法。基于和,我编写了一个工作函数:

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

一般来说,当使用shell命令时,程序依赖于平台是正确的。但是,在这种情况下,我要确保在我使用的机器上安装了外部程序。这不是一个简单的shell命令。关于你的答案-可以使用CreateProcess for windows和fork+exec for unix,但我希望能更优雅地解决这个问题。CreateProcess/fork+exec有什么不优雅的地方?如果你把它包装在一个漂亮的类中,你就有了一个非常优雅的启动流程的方法,而且你可以很容易地添加诸如重定向输出/输入等选项。鉴于WinExec已经被弃用了17年多,我几乎不认为它是“最好”的方法。好吧,我不确定,所以我说它对我来说可能工作得很好,即使我被否决了,我也必须投票,因为我已经搜索了好几个小时了。感谢您提供更好的答案(对于Windows):这不会返回int,我建议从GetExitCodeProcess返回退出代码(std系统返回此值)
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);
  }
}