【发布时间】:2011-11-03 04:19:14
【问题描述】:
我有一个通用单元,它对 GExperts Debugger 和/或 OutputDebugString 进行一些日志记录。我将在控制台应用程序中使用它,所以我希望它能够通过writeln() 输出到标准输出。
主可执行文件已经有 {$APPTYPE CONSOLE} ,但我认为这对我没有帮助。日志记录例程将从几个地方调用:
- 主控制台应用程序,将链接到 BPL,
- 来自另一个“需要”第一个 bpl 的 BPL,并且.....
- 来自静态链接单元的 DLL。
BPL 和 DLL 将在 {$APPTYPE CONSOLE} 指令不可见的情况下构建,因此我不能使用 IFDEF 条件编译。 BPL 和 DLL 需要能够以任意一种方式运行,具体取决于主应用程序是常规的 winapp 还是控制台应用程序。
我想到的一个丑陋的解决方案是使用可执行文件的名称。例如:
if (UpperCase(ExtractFileName(ParamStr(0))) = 'MYCONSOLEAPP.EXE') then ...
但我讨厌这样做,因为我可以拥有其他控制台应用程序...
我宁愿只拥有一个神奇的功能 AmIAConsoleApp : boolean; 有这样的吗? 我在这个项目上使用的是 Delphi2005。
更新:我发现我有点像 this question,但我想调查一下 Delphi 人员,看看是否有更好的方法。
【问题讨论】:
-
有几个善意的、看起来很有帮助的答案建议使用 System.IsConsole。它们被海报删除了,但我觉得参与讨论很有价值。所以这就是它不起作用的原因:System.IsConsole 返回 true,根据文档,“{ True if compiled as console app }”。我没有编译为控制台应用程序(主应用程序是,但 DLL 不是)。所以我的结果好坏参半,具体取决于从哪里调用记录器。
标签: delphi console-application