码迷,mamicode.com
首页 > 其他好文 > 详细

通过DLL对主程序或其它DLL做扩展的一种方法

时间:2015-10-27 17:59:39      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

一、原理: 通过事件来实现扩展

 

二、场景: DLL----A.DLL 

                     扩展DLL---B.DLL

 

三、扩展实现:

         1A.DLL 接口定义

         //接口函数定义

         TQueryFilterEvent = procedure(const AS: string) of object;

         IService = Interface

                   //Get and Set事件

                   function  GetQueryFilterEvent: TQueryFilterEvent;

                   procedure SetQueryFilterEvent(AEvent: TQueryFilterEvent);

property OnQueryFilterEvent: TQueryFilterEvent read GetQueryFilterEvent write setQueryFilterEvent;

         End;

 

         2A.DLL 接口实现

         TService = class(TObject, IService)

                   //实现接口中的方法,并且执行事件

                   FOnQueryFilter: TQueryFilterEvent;

                  Function GetQueryFilterEvent: TQueryFilterEvent;

                   Procedure SetQueryFilterEvent(AEvent: TQueryFilterEvent);

                   Procedure DoQuery

                   procedure DoQueryFilter (const AS: string);

         End;

 

         Procedure TService.DoQueryFilter(const AS: string);

         Begin

if Assigned(FOnQueryFilter) then

                                FOnQueryFilter (AS);

         End;

 

         3A.DLL 中调用TService;

         a.Frame

         FService: TService;

         procedure Init;

         var

                   s: string;

         begin

                   //通过事件做扩展

                   FService.DoQueryFilter(s);

         end;

 

         4B.DLL 中事件扩展对IService挂事件

         TPlugin = function(const AService: IService): IGBQ4Plugin;

         //导出函数

         Exports

CreatePlugin;

         function CreatePlugin(const AService: IService): IPlugin;

begin

                  Result := TPlugin.Create(AService);

end;

 

TPlugin = class(TObject, IPlugin)

  protected

    FService: IService;

  private

    procedure ResponseQueryFilterEvent (const AS: string);

  protected

    procedure Register; virtual;

    procedure UnRegister; virtual;

end;

 

//Register

procedure TPlugin.Register;

begin

//FService挂事件

  FService. OnQueryFilterEvent:= ResponseQueryFilterEvent;

end;

         5A.DLL 中加载B.DLL

TPlugin = function(const AService: IService): IGBQ4Plugin;

 

FPluginLibHandle: THandle;

FPlugin: IPlugin;

         pFunc: TPlugin;

 

         //加载B.DLL

         FPluginLibHandle := LoadLibrary(B.DLL);

         //得到导出函数

@ pFunc:= GetProcAddress(FPluginLibHandle, ‘CreatePlugin‘);

//得到扩展类

         FPlugin := pFunc(FService);

FPlugin.Register;


通过DLL对主程序或其它DLL做扩展的一种方法

标签:

原文地址:http://my.oschina.net/u/566587/blog/522726

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!