【问题标题】:how to open a new cmd.exe in C++ program and get its handle如何在 C++ 程序中打开一个新的 cmd.exe 并获取它的句柄
【发布时间】:2018-01-31 03:49:05
【问题描述】:

我有一个从 Windows 上的 cmd.exe 运行的程序。我想在程序启动时打开第二个 cmd.exe。然后程序会接收来自cmd.exe的stdin的数据来处理,程序的数据会到cmd.exe的stdout。

两个cmd.exe的stdin和stdout是独立的。该程序还可以显示有关第一个 cmd.exe 的信息。它不是重定向。

在 linux 上,我可以使用 proxy_openpt() 和 system("xterm -SX/X") 来控制终端的输入和输出。

我尝试过 createprocess() 和管道,但我不知道如何获取第二个 cmd.exe 的句柄以接收其输入。

请帮帮我,非常感谢!!!

【问题讨论】:

  • CMD 不是控制台或终端;它是一个控制台客户端应用程序,与您自己的应用程序没有什么不同。默认情况下,您的标准 I/O 连接到控制台输入和屏幕缓冲区。如果它是你的父进程,这个控制台可能是从 CMD 继承的,但这就是 CMD 参与的程度。
  • 一个进程一次只能附加到一个控制台,但您可以生成附加到新控制台的应用程序的另一个实例(即CREATE_NEW_CONSOLE 创建标志)。然后使用IPC与之配合,不限于标准手柄和管道。

标签: c++ winapi cmd handle


【解决方案1】:

只有一个 Windows 控制台可以与 Windows 上的单个进程关联。

但是,您当然可以使用一些 IPC 来控制另一个进程,该进程仅充当您的第二个控制台。 Helios 不久前在 cplusplus.com 上写了一个简单的例子来说明如何做到这一点:链接地址为“Extra consoles”。

代码可以按原样使用,但您始终可以使用它来通知您自己的代码。

【讨论】:

    【解决方案2】:

    你可以试试:

    start cmd.exe @cmd /k "Command
    

    或:

    start cmd.exe
    start file.cmd 
    

    【讨论】:

      【解决方案3】:

      您可以从与CreateProcess 一起使用的PROCESS_INFORMATION 结构中获取句柄。

      PROCESS_INFORMATION documentation

      【讨论】:

      • TCHAR szCommandLine[] = TEXT("cmd"); BOOL bRet = ::CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);我可以像这样得到一个新的 cmd.exe。你的意思是 pi.hProcess 是新的 cmd.exe 的句柄?
      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 2013-08-15
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多