插件管理框架 for Delphi(三)

1       前言

2       插件框架(untDllManager

3       使用举例

3.1   类图

插件类图

3.2   客户端组件

TDll派生出TClientDll

根据真实的动态库接口添加相关属性;

3.2.1    组件定义

unit untClientDll;

 

interface

 

uses

  Windows, Classes, SysUtils, untDllManager, untProcDefine;

 

type

 

  EClientDllError = Class(Exception);

 

  { TClientDll

    o 继承自 TDll;

    o 自动获取 ClientInitialize 地址并保存在 ClientInitialize 属性中;

    o 自动获取 ClientInsertTrigger 地址并保存在 ClientInsertTrigger 属性中;

  }

 

  TClientDll = Class(TDll)

  private

    FClientInitialize: TClientInitialize;

    FClientInsertTrigger: TClientInsertTrigger;

    FClientGetDescription: TClientGetDescription;

    FClientSetup: TClientSetup;

    FDescription: String;

    FUseTrigger: Bool;

  protected

    procedure DoDllLoaded; override;

    procedure DoDllUnLoaded; override;

  public

    constructor Create; override;

    property ClientGetDescription: TClientGetDescription read FClientGetDescription;

    property ClientInitialize: TClientInitialize read FClientInitialize;

    property ClientInsertTrigger: TClientInsertTrigger read FClientInsertTrigger;

    property ClientSetup: TClientSetup read FClientSetup;

    property Description: String read FDescription write FDescription;

    property UseTrigger: Bool read FUseTrigger write FUseTrigger;

  end;

 

implementation

 

{ TClientDll }

 

constructor TClientDll.Create;

begin

  inherited;

  FClientInitialize := nil;

  FClientInsertTrigger := nil;

  FClientGetDescription := nil;

  FClientSetup := nil;

end;

 

procedure TClientDll.DoDllLoaded;

begin

  FClientInitialize := GetProcAddress(csClientInitialize);

  if not Assigned(FClientInitialize) then

    raise EClientDllError.Create('No found of Proc "ClientInitialize".');

  FClientInsertTrigger := GetProcAddress(csClientInsertTrigger);

  if not Assigned(FClientInsertTrigger) then

    raise EClientDllError.Create('No found of Proc "ClientInsertTrigger".');

  //可选接口,即使不存在也不报错。

  FClientGetDescription := GetProcAddress(csClientGetDescription);

  FClientSetup := GetProcAddress(csClientSetup);

  inherited;

end;

 

procedure TClientDll.DoDllUnLoaded;

begin

  inherited;

  FClientInitialize := nil;

  FClientInsertTrigger := nil;

  FClientGetDescription := nil;

  FClientSetup := nil;

end;

 

end.

 

3.2.2    组件使用

procedure TXXXXServer.LoadClientDll(const FileName: String);

//功能:加载一个ClientDll,并将相关数据传递进去

var

  Index: Integer;

  Description: String;

  UseTrigger: Bool;

  AClientDll: TClientDll;

begin

  Index := FClientDlls.Add(FileName);

  if Index < 0 then

    raise EXXXXError.CreateFmt('ClientDll "%s" 之前已经装载.', [FileName]);

  //尝试读取地址

  try

    FClientDlls[Index].Loaded := True;

  finally

    if not FClientDlls[Index].Loaded then

      FClientDlls[Index].Free;

  end;

  //初始化该Client,同时将相关信息传入

  UseTrigger := False;

  AClientDll := TClientDll(FClientDlls[Index]);

  if Assigned(AClientDll.ClientSetup) then

    AClientDll.ClientSetup(mscAppPath + 'Client/', False);

end;

3.3   服务端组件

3.3.1    组件定义

unit untServerDll;

 

interface

 

uses

  Windows, Classes, SysUtils, untDllManager, untProcDefine;

 

type

 

  EServerDllError = Class(Exception);

 

  { TServerDll

    o 继承自 TDll;

    o 自动获取 QueryInterface 地址并保存在QueryInterface属性中;

  }

 

  TServerDll = Class(TDll)

  private

    FFunctions: TObject;

    FQueryInterface: TProcQueryInterface;

  protected

    procedure DoDllLoaded; override;

    procedure DoDllUnLoaded; override;

  public

    procedure RefreshAllFunctionsPermit;

    property Functions: TObject read FFunctions write FFunctions;

    property QueryInterface: TProcQueryInterface read FQueryInterface;

  end;

 

implementation

 

uses

  untFunctionProc;

 

{ TServerDll }

 

procedure TServerDll.DoDllLoaded;

begin

  FQueryInterface := GetProcAddress(csQueryInterface);

  if not Assigned(FQueryInterface) then

    raise EServerDllError.Create('No found of "QueryInterface" Proc.');

  inherited; //此句需要放在后面

end;

 

procedure TServerDll.DoDllUnLoaded;

begin

  inherited;

  FQueryInterface := nil;

end;

 

procedure TServerDll.RefreshAllFunctionsPermit;

var

  I: Integer;

begin

  Assert(FFunctions <> nil);

  for I := 0 to TFunctionList(FFunctions).Count - 1 do

    if TFunction(TFunctionList(FFunctions)[I]).Dll = Self then

      TFunction(TFunctionList(FFunctions)[I]).Permit := Permit;

end;

 

end.

 

3.3.2    组件使用

略。

[文终]

 

 

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
Delphi三层框架是一种软件开发架构,将应用程序划分为三个主要层次:用户界面层(表示层)、业务逻辑层和数据访问层。这种框架旨在实现应用程序的模块化、可维护和可扩展。 用户界面层是用户与应用程序交互的部分,通常由窗体、对话框或其他交互元素组成。在Delphi中,可以使用可视化设计工具创建用户界面,例如在窗体上放置按钮、文本框和其他控件来实现用户输入和数据展示。 业务逻辑层是处理应用程序的核心功能和业务规则的地方。在这一层中,开发人员可以编写代码来处理用户的输入、数据处理、验证和计算等操作。这些代码可以实现应用程序的业务逻辑,并将结果返回给用户界面层。 数据访问层是与数据库或其他数据源进行通信的部分。在这一层中,开发人员可以使用Delphi提供的数据库连接组件进行数据的读取、写入和查询操作。这些组件可以帮助开发人员与多种数据库系统进行交互,并提供了一套方便的API来处理数据的访问和操作。 通过将应用程序划分为这三个层次,Delphi三层框架可以实现功能的解耦、简化代码的维护和提高应用程序的性能。开发人员可以专注于不同层次的工作,从而提高开发效率和系统的可靠性。此外,这种框架还可以支持多种数据库系统,使应用程序具有更好的灵活性和可移植性。 总之,Delphi三层框架是一种用于构建模块化、可维护和可扩展应用程序的架构。它将应用程序划分为用户界面层、业务逻辑层和数据访问层,使开发人员能够更好地管理和组织代码,并实现功能的复用和系统的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

musicwind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值