【发布时间】:2021-07-05 10:37:54
【问题描述】:
我在使用 Pascal/FPC/Lazarus 时遇到了以下问题,但我认为它对所有 Windows .exe 文件都是通用的,无论它们是使用什么 IDE/编译器创建的:
我创建了一个 Windows GUI 应用程序,并希望在一个简单的文本控制台中显示一些调试信息。通常在 Pascal 控制台应用程序中,Write 和 WriteLn 用于写入控制台/StdOut,但在项目配置中没有其他措施,这会崩溃,因为在 GUI exe(至少如果使用 Lazarus 创建)中不存在控制台窗口,我获得“文件未打开”异常。
在 Lazarus 中有多种方法(主要是在构建过程中控制 -WG 开关)来获得附加的控制台“write /writeln”可以写入文本,这不是问题。我的问题是,对控制台设备(StdIn、StdOut、StdErr)的支持是否是 Windows 功能,它是 Windows 运行时的一部分,可能由嵌入在 exe 中的一些元数据控制,而这些元数据又由这个 -WG 开关控制,或者它是否是由特定开发环境添加的运行时环境的功能,在这种情况下是由 Lazarus IDE 或底层 FPC 编译器附带的运行时。
谢谢!
【问题讨论】:
-
这取决于可执行目标的子系统,控制台子系统或 gui 子系统。通常显示窗口 UI 的可执行文件以后者为目标,并且没有标准输入、标准输出、标准错误。
-
FPC 中有一个-WG 编译器开关,它在创建GUI 应用程序时控制是否创建附加的带有stdOut 的附加控制台,这是一种显示调试/跟踪信息的便捷方式。我想知道这是适用于所有 WIndows GUI 应用程序的 Windows 功能,还是仅适用于使用 Lazarus/FPC 创建的 Windows 应用程序的 FPC 好东西。
-
这不是我阅读文档时 -WG 所做的。这指定可执行文件将针对 GUI 子系统。 Windows 在这方面与 *nix 有很大不同。如果你想产生调试信息,那么你最好使用日志库。
-
令人困惑!这是否意味着我的目标是“不同的子系统”?情况似乎并非如此,因为我的 GUI 在有和没有 -WG 的情况下都能正常运行。如果我删除 -WG,我只会得到一个额外的文本控制台。
-
正如@Marco 所说,Lazarus 正在为您调用
AllocConsole,这是控制台的来源。通常,GUI 应用程序不应该这样做。使用日志库。
标签: windows windows-runtime freepascal lazarus