我有一个程序,它有 stdout 和 stderr,因此它可以并且确实在这些通道上写入重要的输出。您只能在从 Windows 控制台窗口启动它时看到此输出,通常是通过命令解释器或 Powershell,否则显然您没有任何地方可以看到所述输出。
由于该程序在没有附加控制台窗口的情况下也可以工作,而且它是一个 GUI 应用程序,所以我宁愿避免用户对父控制台或附加控制台感到困惑——除了调试之外,该程序最好在没有控制台的情况下使用。
现在,我希望即使没有使用控制台窗口,也能获得输出。我对 Windows 中进程文件句柄管理的细节不太了解。
是否有可用的程序旨在将程序作为子进程启动,并将 stdout 和 stderr 重定向到一个或多个文件?
我知道老式的命令解释器和 Powershell 可以让你做到这一点,但它们只能通过控制台窗口来实现,而我想要一些没有这种窗口的东西。也许可以使用 Visual Basic 脚本宿主?这仍然是吗?风靡一时? 还有其他解决方案吗?
答案1
我有点困惑该程序如何同时支持控制台和 GUI,因为微软将这两种模式设计为互相排斥的。
微软文章 如何使一个应用程序同时成为 GUI 和控制台应用程序? 说:
在 Windows 中,GUI 应用程序和控制台应用程序有很大不同。GUI 应用程序至少有一个窗口和一个消息循环,但没有标准的输入/输出/错误。控制台应用程序有标准的输入/输出/错误,但没有窗口,没有消息循环。一个应用程序要么是 GUI 应用程序,要么是控制台应用程序,但不能同时是两者。
有些人希望他们的应用程序根据输入做出不同的行为。如果有输入,应用程序的行为就像控制台应用程序。如果没有输入,它的行为就像 GUI 应用程序。
然后列出了两种可能的解决方案。
- 对比
.com
技巧.exe
(.com
总是先被发现.exe
)
在 VisualStudio 中,实际上有两个二进制文件:devenv.com 和 devenv.exe。Devenv.com 是一个控制台应用程序。Devenv.exe 是一个 GUI 应用程序。当您输入 devenv 时,由于 Win32 探测规则,devenv.com 会被执行。如果没有输入,devenv.com 会启动 devenv.exe,然后退出。如果有输入,devenv.com 会将它们作为普通控制台应用程序处理。
- 重生方法
在 ildasm 的情况下,只有一个二进制文件:ildasm.exe。它首先被编译为 GUI 应用程序。随后 editbin.exe 用于将其标记为控制台子系统。在其主要方法中,它确定是否需要以控制台模式或 GUI 模式运行。如果需要以 GUI 模式运行,它会将自身重新启动为 GUI 应用程序。
我不知道你的程序使用了哪种方法,找出答案会很有趣。免费的 进程监控 可以帮助您追踪具体情况。
无论如何,如果您通过控制台启动程序时遇到的问题是控制台的黑色窗口出现在程序后面,那么有一个解决方案。如果您以隐藏方式启动控制台,这不会影响 GUI 的显示,GUI 仍然可见。
请参阅我在帖子中的回答 以完全隐藏的方式运行批处理文件上述任何一种解决方案都应该可行,除非您的程序选择的支持控制台和 GUI 的方法破坏了它。