wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何确定我是否作为控制台应用程序运行? (Win32上的Delphi)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个通用单元,可以记录到GExperts Debugger和/或OutputDebugString.我将在控制台应用程序中使用它,所以我希望它能够通过writeln()输出到stdout. 主可执行文件已经有{$APPTYPE CONSOLE},但我不认为这对我有帮助.将从几个地方调用日志记录例程: >主控制台应用程序,将链接到BPL, >来自另一个“需要”第一个bpl的BPL,…… >从静态
我有一个通用单元,可以记录到GExperts Debugger和/或OutputDebugString.我将在控制台应用程序中使用它,所以我希望它能够通过writeln()输出到stdout.
主可执行文件已经有{$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的副本,但我想调查德尔福人,看看是否有更好的方法.

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

大佬总结

以上是大佬教程为你收集整理的如何确定我是否作为控制台应用程序运行? (Win32上的Delphi)全部内容,希望文章能够帮你解决如何确定我是否作为控制台应用程序运行? (Win32上的Delphi)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: