使用dll进行对象的封装(1)

使用dll进行对象的封装:

使用Dll来封装对象。 主要限制在于: 。调用dll的应用程序只能使用dll中对象的动态绑定的方法。这点是必须的。 。dll封装的对象只能在dll中进行创建。 。在dll和调用dll的应用程序中都需要对封装的对象及其被调用的方法进行声明。 实现dll中对象的动态绑定的方法可以使用virtual和接口两种方法来进行。 使用抽象类也可以是实现dll中对象的动态绑定。

1.简单demo演示dll进行类对象的封装。

a.dll

unit untobj;



interface



type

  TMan = class//    类的实现

  private

    FAge: Integer;

  public

    function GetAge: Integer; virtual;  //使用后期绑定的方法。

    constructor Create;

  end;

implementation



{ TMan }



constructor TMan.Create;

begin

   FAge := 13;

end;



function TMan.GetAge: Integer;

begin

    Result := FAge;

end;



end.



uses

  SysUtils,

  Classes,

  untobj in 'untobj.pas';

// 主要限制在于:

//。调用dll的应用程序只能使用dll中对象的动态绑定的方法。这点是必须的。

//。dll封装的对象只能在dll中进行创建。

//。在dll和调用dll的应用程序中都需要对封装的对象及其被调用的方法进行声明。

{$R *.res}

function ManObj: TMan;  //在dll中到处类对象。

begin

    Result := TMan.Create;

end;



 exports

    manobj;

begin

end.
2.调用dll的实现的过程。
unit untDemo;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type

  TMan = class     //在调用dll的程序中进行相应类的生明。

  public

    function GetAge: Integer; virtual;abstract;  // 使用抽象的方法来进行声明。

  end;

type

  TForm1 = class(TForm)

    btn1: TButton;

    procedure btn1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;

  function ManObj: TMan; external 'dlldemo.dll';  //引用dll中的函数。

implementation



{$R *.dfm}



procedure TForm1.btn1Click(Sender: TObject);

var

  man: TMan;

  i:   Integer;

begin

  man := ManObj;                            // 调用程序中使用dll导出的对象。

  if man = nil then Exit;

  try

   i :=  man.GetAge;

   ShowMessage(IntToStr(i));

  finally

   man.Free;

  end;   

end;



end.
 
第二:使用接口来实现类的封装的简单示例:
1.dll中类以及接口的声明和实现。
unit untISay;// 接口的声明。



interface

type

  ISay = interface

  ['{BB0B17F4-92FB-4B10-83BF-89300D58B8BA}']

      procedure say;

      function  sayInteger: Integer;

  end;

implementation



end.

--------------------------------------------------------------------------------------------

// 类的实现。

unit untMan;



interface

uses Dialogs,untISay;

type

  TMan = class(TInterfacedObject,ISay)

      procedure Say;

      function  SayInteger:Integer;

  end;

implementation











{ TMan }



procedure TMan.Say;

begin

    ShowMessage('nihaoma');

end;



function TMan.SayInteger: Integer;

begin

    Result := 100;

end;



end.



--------------------------------------------------------------------------

dll中导出相应的接口的函数。

uses

  SysUtils,

  Classes,

  untISay in 'untISay.pas',

  untMan in 'untMan.pas';



{$R *.res}

function outputobj: ISay;

begin

    Result := TMan.create;// 这个关键的地方。

end;



    exports

    outputobj;

begin

end.



在调用dll程序中的
unit untmain;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs,untISay, StdCtrls;// 主要添加相应的UntISay接口声明的单元



type

  TForm1 = class(TForm)

    btn1: TButton;

    btn2: TButton;

    procedure btn1Click(Sender: TObject);

    procedure btn2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

    m: ISay;// 

  end;



var

  Form1: TForm1;

  function  outputobj:ISay; external 'dllobj.dll'; //----------------------------

implementation



{$R *.dfm}



procedure TForm1.btn1Click(Sender: TObject);

begin

 m := outputobj;

 m.say;

 m := nil;

end;



procedure TForm1.btn2Click(Sender: TObject);

begin

 m := outputobj;

 ShowMessage(IntToStr(m.sayInteger));

 m := nil;

end;



end.
第三。使用抽象类的情况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值