我有一个通用单元,可以将一些日志记录到 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。
更新:我发现我有点像这个问题 https://stackoverflow.com/questions/744693/how-do-i-detect-if-im-running-in-the-console,但我想调查一下 Delphi 人员,看看是否有更好的方法。
Call GetStdHandle(Std_Output_Handle)
。如果成功并返回零,则没有可写入的控制台。其他返回值表明控制台已附加到进程,因此您可以对其进行写入(尽管控制台可能不是在控制台程序中记录消息的最理想位置,因为它们会干扰正常输出)。像这样的事情:
function IAmAConsoleApp: Boolean;
var
Stdout: THandle;
begin
Stdout := GetStdHandle(Std_Output_Handle);
Win32Check(Stdout <> Invalid_Handle_Value);
Result := Stdout <> 0;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)