gpt4 book ai didi

delphi - 如何确定我是否作为控制台应用程序运行? (Win32 上的德尔福)

转载 作者:行者123 更新时间:2023-12-03 14:43:06 25 4
gpt4 key购买 nike

我有一个通用单元,可以将一些日志记录到 GExperts Debugger 和/或 OutputDebugString。我将在控制台应用程序中使用它,因此我希望它能够通过 writeln() 输出到标准输出。
主要可执行文件已经有 {$APPTYPE CONSOLE} ,但我认为这对我没有帮助。日志记录例程将从几个地方调用:

  1. 主控制台应用程序,它将链接到 BPL,
  2. 来自另一个“需要”第一个 bpl 的 BPL,并且......
  3. 来自静态链接该单元的 DLL。

BPL 和 DLL 将在 {$APPTYPE CONSOLE} 指令不可见的情况下构建,因此我无法使用 IFDEF 条件编译。 BPL 和 DLL 需要能够采用任一方式,具体取决于主应用程序是常规 winapp 还是控制台应用程序。

我想到的一个丑陋的解决方案是使用可执行文件的名称。例如:

if (UpperCase(ExtractFileName(ParamStr(0))) = 'MYCONSOLEAPP.EXE')  then ...

但我讨厌这样做,因为我可以有其他控制台应用程序......

我宁愿有一个神奇的函数 AmIAConsoleApp : boolean;有这样的事吗?我在这个项目中使用Delphi2005。

更新:我发现我有点像this question ,但我想调查一下 Delphi 人员,看看是否有更好的方法。

最佳答案

调用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;

关于delphi - 如何确定我是否作为控制台应用程序运行? (Win32 上的德尔福),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182264/

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