2

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

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

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

4

3 回答 3

1

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

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

编辑

Indeera 发布的链接显示了如何执行第二个选项。

编辑

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

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

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

编辑

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

于 2009-08-18T19:08:04.333 回答
1

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

于 2009-08-19T13:37:55.277 回答
0

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

于 2009-08-18T19:08:34.397 回答