【问题标题】:system() to c++ without calling cmd.exesystem() 到 c++ 而不调用 cmd.exe
【发布时间】:2010-10-06 19:01:57
【问题描述】:

如何在不显示 cmd.exe 的情况下运行 system("")?

我使用 cstdlib 标头 代码::blocks 10.5

我看到了 c# 的 this question,但我不知道 c# ;)

【问题讨论】:

  • 其实,你不是在隐藏 cmd.exe,而是在隐藏命令提示符。 CMD 只是一个解释器。实际的命令窗口本身由 Windows NT 提供(特别是在 Vista 和更早版本上的 csrss.exe,以及在 7 和更高版本上的 csrss.exe 和 conhost.exe)。这就是为什么所有控制台程序,而不仅仅是 cmd.exe,都使用相同的控制台窗口类型。

标签: c++ c cmd


【解决方案1】:

我相信你必须改用CreateProcess

【讨论】:

  • CreateProcess 似乎只适用于 Windows,不适用于 Linux 或 Mac。有什么方法可以用标准的system() 函数修复它?
  • 请随时在您的问题中指定目标平台。但是,cmd.exe 非常特定于 Windows。由于您要求标准库之外的功能,因此没有适用于所有平台的简单答案。
  • 但是这个问题只是在windows中。在 unix 中,Terminal(或控制台)是与 Shell 分开的东西。所以调用shell命令时不会出现终端窗口。我不是这个话题的提问者,但假设我们正在为所有平台编写一个应用程序(并且它可以工作),但我们不喜欢它在调用 system() 时在 Windows 中打开终端。
  • @ilius 听起来你有一个新问题的候选人。这个隐含地针对 Windows。
  • @ilius 在你的情况下,你可能需要一些#ifdefs。
【解决方案2】:

我必须说,现有的答案并不是特别具有描述性。这是一种无需新的cmd.exe 窗口即可执行命令的方法。

基于an answer by Roland RabienMSDN,我写了一个工作函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多