【问题标题】:How can I make a hidden, disposable console application and communicate with it?如何制作隐藏的一次性控制台应用程序并与之通信?
【发布时间】:2010-11-20 17:11:50
【问题描述】:

我编写了一个小型控制台应用程序来包装有问题的第三方 DLL。我使用_popen 从GUI 应用程序调用它,并且只想从控制台程序的标准输出中读取一个值。这样做时,会短暂显示一个不需要的控制台窗口。

我知道这可以通过使用带有 CreateProcess 的特定 STARTUPINFO 配置来避免。但是,我更愿意将修复程序放在控制台应用程序中并仍然使用 _popen。使用 windows 子系统(即 WinMain 而不是 main)创建子进程不会使控制台窗口消失。显然,操作系统分配了一个控制台来方便_popen通信。

请注意,第三方 DLL 不稳定,但需要与专有硬件接口。因此,任何将DLL加载到GUI应用程序内存空间的方法都是不可接受的。

【问题讨论】:

  • 这是可能的,因为我已经在previous question 中回答了这个问题
  • 我很清楚如何制作非控制台应用程序。我的问题是是否可以在不分配控制台窗口的情况下从父进程读取非控制台应用程序的标准输出。
  • 在这种情况下,您应该编辑问题和标题
  • Indeera,我同意。随意进行编辑。

标签: winapi console pipe stdout popen


【解决方案1】:

1) 我支持将 STARTUPINFO 设置为隐藏窗口来启动它的想法。这是 Windows 上的 SOP,所以它比试图强加 Unix SOP 效果更好。此外,您可能希望在单独测试时看到输出。

2) 或者您可以制作一个从不显示窗口的 GUI 应用程序。它相当于一个没有控制台的控制台应用程序。

编辑

link Indeera 发布的帖子显示了如何执行第二个选项。

编辑

好的,如果您只想向父级发送信息,最简单的方法是编写文件。保持这种有序性的一种方法是让父级传递一个唯一的文件名作为命令行参数,子级将写入该文件名。父级可以监视文件并对其内容采取行动。

有很多替代品。与目前讨论的两种方法最接近的是命名管道,但您也可以使用各种形式的 IPC,包括基于套接字的。

但是,您不能在没有控制台的情况下访问 stdin/stdout/stderr。您可以使用隐藏控制台启动,但它必须有一个。

编辑

lua 是否允许直接运行可执行文件,而不是通过 cmd.exe?

【讨论】:

  • 我正在查看 Lua 源代码,它只是在调用 _popen。
  • 对不起,我不清楚。它被称为 _popen 来打开管道,但我试图了解它调用什么来生成进程。
  • 实际上,_popen 也产生了进程。来自 MSDN:“创建管道并执行命令。”见msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx
  • 我正在运行 Vista,但从我从一个用于完全中断的 GUI 应用程序中读取 _popen 的用法。
  • 我只想说你对高效开发很感兴趣。哦,既然你有 Unix 背景,让我提醒你,Windows 下的命名管道与它们的 Unix 同名管道并不完全相同。如需快速参考,请查看en.wikipedia.org/wiki/Named_pipe#Named_pipes_in_Windows
【解决方案2】:

要在父 GUI 应用程序和隐藏的子控制台应用程序之间进行通信,请参考以下 MSDN 文章:

【讨论】:

    【解决方案3】:

    如果不启动控制台,我认为您不能使用标准输入/标准输出。不过,您可以做的是将包装应用程序编写为不显示任何窗口的 GUI 应用程序(只需将 main() 切换到 winmain()),然后使用某种类型的 IPC 机制,如套接字或共享内存。

    【讨论】:

    • 如果可能的话,我建议在命令行中传递它需要的命令。
    • 不,我只需要从子进程到父进程的通信。
    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 2011-01-09
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2016-03-30
    • 2011-04-20
    • 2011-04-04
    相关资源
    最近更新 更多