delphi - 自动检测应用程序 "Type"

标签 delphi

我使用我的框架构建了四种不同“类型”的应用程序:

1) Windows 服务 2) 正常应用 3) 服务应用程序(具有 Windows 服务功能但具有本地 GUI 控制台和自动升级能力的普通应用程序) 4) 远程GUI控制台

现在我可以通过代码检测应用程序是否是 Windows 服务。但目前为了在其他之间进行检测,我使用需要添加到项目文件中的定义。如果可能的话,我想找到一种不依赖 DEFINES 的替代方法。我最初的想法是使用项目版本信息的“注释”字段。

有什么想法吗?

编辑:我正在寻求一种无论我如何“键入”应用程序都有效的通用技术。目前,我使用项目配置中的 DEFINES,它可以工作,但使代码比使用“if”代码开关稍微困惑,并且因为它存储在 .dproj 文件中,所以可以从 View 中隐藏。

解决方案:根据 David 的建议,我最初使用条件定义(以及任何其他信息,例如应用程序是否作为 Windows 服务运行)将所有应用程序映射到 4 种应用程序类型之一,存储在全局可访问的对象中。除非链接的文件对于包含在特定应用程序类型中没有意义,否则我用代码替换了几乎所有条件编译标志,这显着提高了代码的可读性。我还实现了一些其他“调整”,但这是基本实现。

最佳答案

根据您使用Application全局变量的方式,您可以通过检查此全局变量的类型来检测您的应用程序是服务、VCL还是控制台应用程序。对于控制台应用程序,您可以使用 System.IsConsole变量。

function ApplicationIsService(Component:TComponent):Boolean;
begin
   Result:=Component.ClassName='TServiceApplication';
end;

function ApplicationIsVcl(Component:TComponent):Boolean;
begin
   Result:=Component.ClassName='TApplication';
end;

你可以这样使用

if ApplicationIsVcl(Application) then
//do something
else
if ApplicationIsService(Application) then
//do something else
else
if IsConsole then
//do another thing

关于delphi - 自动检测应用程序 "Type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052896/

相关文章:

function - 在Delphi中,如何从asm语句中调用私有(private)属性读取函数

Delphi - 拖放 + MouseDown + MouseUp

delphi - E2511 类型参数 'T' 必须是类类型编译器错误是什么意思?

delphi - 使用 Thunderbird 从 Delphi 发送邮件

delphi - 如何在窗体上绘制透明文字?

delphi - 在 Delphi 中同时打开两个 HTMLHelp 文件会导致两个帮助窗口挂起

delphi - 缩放像素值以进行打印

algorithm - 我如何进行类似 iPhone 按钮的填充

android - 套接字错误 #113 没有到 Android 主机的路由

delphi - 初始化字符串函数结果?