gpt4 book ai didi

可选择保持附加到控制台的 Windows 应用程序

转载 作者:可可西里 更新时间:2023-11-01 10:01:03 30 4
gpt4 key购买 nike

我有一个 Windows 应用程序(用 C 编写,用 MSVC Express 版本编译,32 位模式),它有两种主要的操作模式:

  • 窗口模式——创建一个窗口,并在其中绘制东西(即分形)。
  • 基准测试模式——当以 --benchmark 作为参数运行时,不创建窗口,只是将一些基准统计信息打印到标准输出。

在开发过程中,我编译为控制台应用程序,并使用 SDL 创建窗口并执行其他 GUI 功能。所以基准模式运行良好(没有创建窗口),而图形模式只有一个挥之不去的控制台窗口。

然而,对于我的发布编译,我启用了 Windows 子系统而不是控制台。 (如 this question 中所述)。这很好用,除非我突然发现我不能再运行基准测试了。 :o

我只是想知道,有没有一种方法可以让应用程序在运行时选择(例如,根据给定的命令行)使用哪种子系统行为?

我已经在 Windows(资源管理器、记事本、winword)中对 EXE 文件进行了一些实验,当使用“/?”之类的参数运行时,它们似乎都没有向控制台打印任何内容。 (大多数 Windows 控制台应用程序都支持)。所以它看起来不像,但我认为在这里值得一问,以防万一有什么特别的把戏。

更新。看起来,不,你不能。谢谢大家的回答。

其他学术问题。这是否意味着子系统选择已在 EXE header 中标记,并且是操作系统检查它并设置窗口或将其连接到运行它的控制台?我不太了解 EXE 加载,但我很想在这里了解一些细节。

结论。我认为有四个好的解决方案(加上两个半解决方案,总共五个 :p)可供选择:

  1. 使用控制台子系统,但在 GUI 模式下运行时使用 FreeConsole。
  2. 使用windows系统,在benchmark模式下运行时使用AllocConsole。如果从现有控制台运行 fractal.exe 则不完美,因此我将其视为解决方案的一半;-)。
  3. 每个子系统只有一个可执行文件,fractal.exe 和 fractalgui.exe。
  4. 有两个(或更多)可执行文件,其中一个执行工作并将其传递给另一个以显示在控制台或适当的窗口中。需要考虑如何划分程序以及如何在它们之间进行通信。
  5. 另一个半解决方案:让 fractalgui.exe 将基准打印到标准输出,并将其通过管道传输到一个实用程序,该实用程序将简单地打印它。

我还没有选择,但我倾向于#3。

感谢 Matteo 和 smerlin 的想法!

最佳答案

应用程序无法在运行时选择她的子系统(确实有一些非常丑陋的变通办法,但那些都充满了怪癖)。

这个问题的一般解决方案是有一个控制台应用程序,它在必要时启动你的 gui 应用程序

对于您的基准案例,它只会打印您的基准统计数据。

示例设置:
- fractalgui.exe(子系统:windows)
- fractal.exe(子系统:控制台)

* 用户桌面上的快捷方式链接到您的 fractalgui.exe
* 如果用户从控制台启动 fractal.exefractal exe 会启动 fractalgui.exe
* 如果用户启动 fractal.exe --benchmark,它会自己执行基准测试(如果可以将此基准逻辑添加到另一个可执行文件中)并将信息直接打印到控制台,或者 - 如果是这样不可能 - 它需要启动 fractalgui.exe --nogui --benchmark。这里棘手的情况是将您的输出从 fractalgui.exe 获取到 fractal.exe,以便您可以在适当的控制台上打印它。有几种方法可以做到这一点,例如命名管道(有一些方法可以以某种方式启动 fractalgui.exe,你可以在那里使用 stdout/cout,数据将通过管道传输到 fractal.exe 的 stdout,但我不记得它的工作原理了(编辑:也许 this 有效))。最简单的方法是启动 fractalgui.exe --nogui --benchmark > mylogfile 然后在 fractalgui.exe 完成后打印 mylogfile(因为如果输出被重定向,fractalgui.exe 的 stdout/cout 将工作到文件),但是您不会获得“实时”输出,因为当 fractalgui.exe 已经完成时,所有输出都将打印在控制台上。

关于可选择保持附加到控制台的 Windows 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030831/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com