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

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

 

二、场景: 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,扩展,Delphi)