插件框架Extensible Framework for Delphi
工作需要开发的一套插件框架,给应用程序提供灵活的插件支持,基于Dll / Interface实现。
先上个图
这是个标准的基于插件的应用,下拉框里的就是由5个插件Dll提供的功能。主程序中定义了一个接口,而插件Dll则提供这个接口的实现。
使用也很简单,在窗口上放置一个TExtensionManager组件,设置一下插件的读取路径就可以了。
框架中有3个重要概念,ServiceHost,Module(模块)和扩展(Extension)
1.ServiceHost是整个框架的灵魂,不管是主程序中还是插件中,都通过他来查询和使用其他的插件对象。
下面是一段使用示例代码:
(ServiceHost as ILoggingService).Log("This is a log");
(ServiceHost as IParameterService).SetValue("Param1", "Value1");
(ServiceHost as IMyPlugin).Foo();
(ServiceHost as IMyExtension).Execute();
2.Module是Extension的容器,即一个Module包含多个Extension。但实际上Module本身并不提供任何功能,也不提供Extension的管理功能,仅仅为Extension提供逻辑上的分组,同时为应用程序提供分组相关的信息。一个插件Dll中可以包含多个Module。
3.Extension是扩展对象管理类,当某个类实现了插件接口后,通过此对象对外发布,并由此对象管理其生命周期。
另外,框架里还提供了一些常用的服务,也是做为插件存在的,如上面的ILoggingService和IParameterService
IParameterService
参数服务,为应用程序和扩展提供参数支持,如 $(AppPath)
IRegistryService
注册表服务,用于信息储存和读取
ILoggingService
日志服务,通过信道将消息输出到不同的位置
IChannel
日志信道,用于将消息输出到指定的位置
ILocalizationService
本地化服务,用于提供本地化的资源
ILocaleSource
本地化服务数据源
ISplashService
闪屏服务,用于访问闪屏窗口
IDialogService
对话框服务,用于提供各种对话框
ILoginService
登录服务,用于控制用户登录
再贴几张Demo的图吧
示例代码:
unit uModule;
interface
implementation
uses
EFToolServices, EFModule, EFWinRegistry, EFLogging, EFParameter;
initialization
TInterfaceExtension.Create(IRegistryService, TWindowsRegistryService.Create,
'2011.08.11', 'RegistryService', 'IRegistryService Provider', 'Author: sephil');
TInterfaceExtension.Create(ILoggingService, TLoggingService.Create,
'2011.08.11', 'LoggingService', 'ILoggingService Provider', 'Author: sephil');
TInterfaceExtension.Create(IParameterService, TParameterService.Create,
'2011.08.11', 'ParameterService', 'IParameterService Provider', 'Author: sephil');
end.
unit uDllImpl;
interface
implementation
{$I EFDef.inc}
uses
EFExports, { export dll entry proc }
EFSystem, EFToolServices, EFModule, EFSysUtils,
uDocIntf, Windows, Messages, SysUtils;
type
TDllObject = class(TInterfacedObject, IDllObject)
private
procedure ExecOpen;
procedure ExecInsert(CanUndo: Boolean);
end;
TDllModule = class(TModule)
protected
class function InitializeComponents(Host: IInterface): Integer; override;
procedure UpdateDesctiption; override;
public
procedure Initialize; override;
procedure Finalize; override;
end;
{ TDllObject }
procedure TDllObject.ExecOpen;
var
S: WideString;
begin
(ServiceHost as IParameterService).GetValue('$(APPPATH)', S);
S := S + '\TextDoc.txt';
(ServiceHost as IDocument).Open(S);
end;
procedure TDllObject.ExecInsert(CanUndo: Boolean);
var
S: string;
begin
S := FormatDateTime('c', Now);
SendMessage((ServiceHost as IDocument).GetHWND,
EM_REPLACESEL, WPARAM(CanUndo), LPARAM(PChar(S)));
end;
{ TDllModule }
function GetModule: string;
begin
SetString(Result, nil, MAX_PATH);
SetLength(Result, GetModuleFileName(HInstance, @Result[1], MAX_PATH));
end;
class function TDllModule.InitializeComponents(Host: IInterface): Integer;
var
S: WideString;
begin
(ServiceHost as ILoggingService).Write('TDllModule.InitializeComponents');
(ServiceHost as IParameterService).GetValue('$(D2007)', S);
if {$IFDEF DELPHI12_UP}not{$ENDIF} StrToBool(S) then Result := 0 else Result := 1;
if Result <> 0 then
(ServiceHost as ILoggingService).Write(ExtractFileName(GetModule) + ' skipped')
else
(ServiceHost as ILoggingService).Write(ExtractFileName(GetModule) + ' loaded');
end;
procedure TDllModule.UpdateDesctiption;
begin
// original info from version info
inherited;
end;
procedure TDllModule.Initialize;
var
Intf: ILoggingService;
begin
inherited;
(ServiceHost as ILoggingService).Write('TDllModule.Initialize');
end;
procedure TDllModule.Finalize;
begin
inherited;
(ServiceHost as ILoggingService).Write('TDllModule.Finalize');
end;
initialization
RegisterModuleClass(TDllModule);
TExtensionFactory.Create(IDllObject, TDllObject, '2011.08.08',
'Dll Object', 'IDllObject implementation', 'Author: sephil');
end.
转载于:https://www.cnblogs.com/sephil/archive/2012/02/22/extensible.html
插件框架Extensible Framework for Delphi相关推荐
- Java Plugin Framework (JPF) java插件框架学习
2019独角兽企业重金招聘Python工程师标准>>> JPF (Java Plugin Framework) 是一个插件框架,类似Eclipse的插件系统,不过这个的依赖关系是使用 ...
- 在ASP.NET MVC应用中开发插件框架(中英对照)
[原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I'v ...
- 基于Proxy思想的Android插件框架
本文所有代码托管在Github:android-plugin 意义 研究插件框架的意义在于以下几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级,减小网络流量 静默升级,用户无感知情况 ...
- ctk编译linux,CTK插件框架学习5-插件间通信(Netlink实现热拔插监控)
本章来写一个插件,插件功能为通过NETLINK读取linux系统中的hotplug信息,比如usb.SD卡.磁盘等设备的插拔事件产生的信息,将读到的信息通过插件间通信的方式发出. 1. eventad ...
- (2)从实际项目谈起,基于MEF的插件框架之总体设计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.MEF框架简介 MEF的全称是Managed Extensibil ...
- Android 插件化原理 完胜360插件框架 技术实战
性能优化 Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 ...
- 应用程序框架 Application Framework
转自:http://www.cnblogs.com/BigTall/archive/2007/12/06/985101.html 应用程序框架设计之前言 要做一个应用程序框架的念头Bigtall在几年 ...
- 调度框架 Scheduling Framework 实践
调度框架 Scheduling Framework 架构设计 工作流程图可以查看 相关文档参见 sig-scheduling 前提 调度框架定义了一组扩展点,用户可以实现扩展点定义的接口来定义自己的调 ...
- 我们一起完成插件框架的设计与实现
我们一起完成插件框架的设计与实现 原文:我们一起完成插件框架的设计与实现 开场一些题外话,今天登陆这个"小菜"的博客园,感触颇多."小菜"是我以前在QQ群里面的 ...
最新文章
- 视频动作识别--Two-Stream Convolutional Networks for Action Recognition in Videos
- python 新建文件 hdfs_大数据学习(六):Python操作hdfs(包括追加数据文件到hdfs文件)...
- 基于openstack搭建百万级并发负载均衡器的解决方案
- leetcode176. 第二高的薪水(SQL)
- 使用openssl开源AES算法,实现aes、aes-cbc和aes-ecb对字符串的加解密
- 将NLog与ASP.NET Core Web应用程序集成
- html浏览器兼容测试工具,13个不同浏览器兼容性测试的免费软件工具
- HDU2520 我是菜鸟,我怕谁【水题】
- python mro算法_Python MRO C3算法实现
- python程序打印出10行的杨辉三角_GitHub 标星 6.5w+,Python 小白 100 天学习计划,从新手到玩转!...
- 手机电视-CMMB系统技术应用浅谈
- 自行搭建 Bitwarden 服务
- Gestalt laws
- lighttpd服务器搭建教程
- 老婆反问我:“是不是也算个凤凰男啊?”
- xx省联通SUN M5000清除故障灯MBU_B Degraded
- 一个在阿里做运营同学找一个月多月工作总结出以下几点
- 嵌入式硬件Linux,嵌入式linux硬件什么要求
- Chrome调试工具调试CSS
- mysql insert 返回值是什么_各种SQL Insert 返回值
热门文章
- CUDA、CUDA toolkit、CUDNN、NVCC关系
- 【深度学习】卷积神经网络速成
- 【Java Web开发指南】FilterListener笔记
- python【蓝桥杯vip练习题库】ADV-9 递归倒置字符数组
- PHP文件在线检测病毒,VIRSCAN 在线病毒检测客户端
- taro 引入js_Taro跨端开发之多业务模块管理 React Native篇(终篇)
- 外贸网络推广浅析怎么能更有效地提升网站的收录?
- 网络推广软件浅谈关键词如何布置才能让优化更事半功倍!
- 网站增改不要只想着收益更应该思考原有的损失
- mysql warning 在哪看_查看MySQL的warning