我用我的框架构建了四种不同的“类型”应用程序:
1)Windows服务 2)正常应用 3)服务应用程序(具有Windows服务功能但具有本地GUI控制台和自动升级功能的普通应用程序) 4)远程GUI控制台
现在,我可以通过代码检测应用程序是否为Windows服务。但是目前要在其他人之间进行检测,我使用需要添加到项目文件中的DEFINES。如果可能的话,我想找到一种不依赖于DEFINES的替代方法。我最初的想法是使用项目版本信息的评论字段。
有什么想法吗?
编辑:我正在使用一种通用技术,无论我如何“键入”我的应用程序。目前我使用项目配置中的DEFINES,但是使得代码比使用“if”代码开关稍微麻烦,并且因为它存储在.dproj文件中,可以从视图中隐藏。
解决方案:根据David的建议,我最初使用条件定义(以及任何其他信息,例如应用程序是否作为Windows服务运行)将所有应用程序映射到4种应用程序类型之一,存储在全局可访问的对象中。除非将没有意义的文件链接到特定的应用程序类型,否则我用代码替换了几乎所有的条件编译标志,这显着提高了代码的可读性。我实施了一些其他的“调整”,但这是基本的实现。
答案 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文件似乎是合乎逻辑的。
如果是我,我会坚持条件,但使用将其转换为带有共享帮助方法的Delphi枚举的技巧,以使其更好地阅读。