自动检测应用程序“类型”

时间:2011-05-19 01:40:35

标签: delphi

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

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

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

有什么想法吗?

编辑:我正在使用一种通用技术,无论我如何“键入”我的应用程序。目前我使用项目配置中的DEFINES,但是使得代码比使用“if”代码开关稍微麻烦,并且因为它存储在.dproj文件中,可以从视图中隐藏。

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

2 个答案:

答案 0 :(得分:2)

根据您使用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

答案 1 :(得分:1)

听起来每个项目都有一个应用类型,因此区分.dpr文件或.dproj文件似乎是合乎逻辑的。

  • 调用函数以从.dpr文件设置私有全局变量。
  • 或者像现在一样使用.dproj中定义的条件。

如果是我,我会坚持条件,但使用将其转换为带有共享帮助方法的Delphi枚举的技巧,以使其更好地阅读。

相关问题