工作需要开发的一套插件框架,给应用程序提供灵活的插件支持,基于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的图吧

示例代码:

View Code

// 主程序
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.

View Code

// 插件
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相关推荐

  1. Java Plugin Framework (JPF) java插件框架学习

    2019独角兽企业重金招聘Python工程师标准>>> JPF (Java Plugin Framework) 是一个插件框架,类似Eclipse的插件系统,不过这个的依赖关系是使用 ...

  2. 在ASP.NET MVC应用中开发插件框架(中英对照)

    [原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I'v ...

  3. 基于Proxy思想的Android插件框架

    本文所有代码托管在Github:android-plugin 意义 研究插件框架的意义在于以下几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级,减小网络流量 静默升级,用户无感知情况 ...

  4. ctk编译linux,CTK插件框架学习5-插件间通信(Netlink实现热拔插监控)

    本章来写一个插件,插件功能为通过NETLINK读取linux系统中的hotplug信息,比如usb.SD卡.磁盘等设备的插拔事件产生的信息,将读到的信息通过插件间通信的方式发出. 1. eventad ...

  5. (2)从实际项目谈起,基于MEF的插件框架之总体设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.MEF框架简介 MEF的全称是Managed Extensibil ...

  6. Android 插件化原理 完胜360插件框架 技术实战

    性能优化 Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 ...

  7. 应用程序框架 Application Framework

    转自:http://www.cnblogs.com/BigTall/archive/2007/12/06/985101.html 应用程序框架设计之前言 要做一个应用程序框架的念头Bigtall在几年 ...

  8. 调度框架 Scheduling Framework 实践

    调度框架 Scheduling Framework 架构设计 工作流程图可以查看 相关文档参见 sig-scheduling 前提 调度框架定义了一组扩展点,用户可以实现扩展点定义的接口来定义自己的调 ...

  9. 我们一起完成插件框架的设计与实现

    我们一起完成插件框架的设计与实现 原文:我们一起完成插件框架的设计与实现 开场一些题外话,今天登陆这个"小菜"的博客园,感触颇多."小菜"是我以前在QQ群里面的 ...

最新文章

  1. 视频动作识别--Two-Stream Convolutional Networks for Action Recognition in Videos
  2. python 新建文件 hdfs_大数据学习(六):Python操作hdfs(包括追加数据文件到hdfs文件)...
  3. 基于openstack搭建百万级并发负载均衡器的解决方案
  4. leetcode176. 第二高的薪水(SQL)
  5. 使用openssl开源AES算法,实现aes、aes-cbc和aes-ecb对字符串的加解密
  6. 将NLog与ASP.NET Core Web应用程序集成
  7. html浏览器兼容测试工具,13个不同浏览器兼容性测试的免费软件工具
  8. HDU2520 我是菜鸟,我怕谁【水题】
  9. python mro算法_Python MRO C3算法实现
  10. python程序打印出10行的杨辉三角_GitHub 标星 6.5w+,Python 小白 100 天学习计划,从新手到玩转!...
  11. 手机电视-CMMB系统技术应用浅谈
  12. 自行搭建 Bitwarden 服务
  13. Gestalt laws
  14. lighttpd服务器搭建教程
  15. 老婆反问我:“是不是也算个凤凰男啊?”
  16. xx省联通SUN M5000清除故障灯MBU_B Degraded
  17. 一个在阿里做运营同学找一个月多月工作总结出以下几点
  18. 嵌入式硬件Linux,嵌入式linux硬件什么要求
  19. Chrome调试工具调试CSS
  20. mysql insert 返回值是什么_各种SQL Insert 返回值

热门文章

  1. CUDA、CUDA toolkit、CUDNN、NVCC关系
  2. 【深度学习】卷积神经网络速成
  3. 【Java Web开发指南】FilterListener笔记
  4. python【蓝桥杯vip练习题库】ADV-9 递归倒置字符数组
  5. PHP文件在线检测病毒,VIRSCAN 在线病毒检测客户端
  6. taro 引入js_Taro跨端开发之多业务模块管理 React Native篇(终篇)
  7. 外贸网络推广浅析怎么能更有效地提升网站的收录?
  8. 网络推广软件浅谈关键词如何布置才能让优化更事半功倍!
  9. 网站增改不要只想着收益更应该思考原有的损失
  10. mysql warning 在哪看_查看MySQL的warning