国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Delphi 中的DLL 封裝和調(diào)用對(duì)象技術(shù)

Delphi 中的DLL 封裝和調(diào)用對(duì)象技術(shù)

  

  

Delphi用DLL來(lái)封裝對(duì)象的技術(shù)主要有三種:

用接口實(shí)現(xiàn)
用純虛和抽象類(lèi)方法實(shí)現(xiàn)
用類(lèi)引用實(shí)現(xiàn)

前兩種,都是在DLL中生成類(lèi)實(shí)例;第3種通過(guò)在調(diào)用方生成實(shí)例。三種方法的共同局限如下:
調(diào)用方只能調(diào)用封裝類(lèi)中的virtual方法;
調(diào)用方和提供方都必須提供類(lèi)的描述,接口實(shí)現(xiàn)中需要提供接口描述(COM方法例外);
不能創(chuàng)建DLL包含對(duì)象的派生類(lèi)(接口派生除外)。

首先,用接口實(shí)現(xiàn)當(dāng)然包括COM實(shí)現(xiàn),不過(guò)由于COM是一種實(shí)現(xiàn)接口技術(shù)的獨(dú)立門(mén)類(lèi),所以在下面說(shuō)的接口實(shí)現(xiàn)中不包括這方面的東西。其次用純虛和抽象類(lèi)方法實(shí)現(xiàn),在《Delphi 6 Developer‘s Guide》中提及的inc文件作為公用的頭文件,和劉藝在《Delphi面向?qū)ο缶幊趟枷搿分刑峒暗姆椒ū举|(zhì)上是一樣的。無(wú)非都是為了在調(diào)用方加入abstract關(guān)鍵字,而無(wú)需方法實(shí)現(xiàn),從而使得編譯通過(guò)。inc文件的方法是利用宏指令來(lái)達(dá)到統(tǒng)一處理,不用inc方法是在兩處都需要進(jìn)行描述。
下面用一個(gè)例子來(lái)展示所以上面提到的集中方法。

調(diào)用方主要文件列表為:
UnitMain.pas  調(diào)用DLL的界面
UnitPublic.pas  第二種方法在調(diào)用端的類(lèi)描述文件
UnitIDest.pas  接口方法和類(lèi)引用方法的類(lèi)描述文件
IncDemo.inc  利用inc文件實(shí)現(xiàn)的類(lèi)描述文件
DLL工程主要文件列表為:
ProDLLDemo.dpr  DLL工程文件
UnitDLLDemo.pas  所有類(lèi)實(shí)現(xiàn)部分的文件
UnitIDest.pas  接口方法和類(lèi)引用方法的類(lèi)描述文件
IncDemo.inc  利用inc文件實(shí)現(xiàn)的類(lèi)描述文件
在方法的歸納上如有遺漏,有請(qǐng)指教。

UnitMain.pas 源代碼:
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, UnitPublic, UnitIDest;
{$I IncDemo.inc}
// 用于Inc方法的宏指令,如果不是用該方法可去掉上面那行
type
  TfmMain = class(TForm)
    Memo1: TMemo;
    btnUseAbstract: TButton;
    btnUseReference: TButton;
    btnUseInterface: TButton;
    btnUseInc: TButton;
    procedure btnUseAbstractClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnUseInterfaceClick(Sender: TObject);
    procedure btnUseReferenceClick(Sender: TObject);
    procedure btnUseIncClick(Sender: TObject);
    private
  { Private declarations }
    public
  { Public declarations }
  end;
var
  fmMain: TfmMain;
  function GetNewspaper: TNewspaper; external 'ProDLLDemo.dll';
  function GetCircle: ICircle; external 'ProDLLDemo.dll';
  function GetBall: TBallClass; external 'ProDLLDemo.dll';
  function GetCar: TCar; external 'ProDLLDemo.dll';

implementation

{$R *.dfm}

procedure TfmMain.FormCreate(Sender: TObject);
begin
  memo1.Lines.Clear;
end;

// abstract, virtual 方法示例

procedure TfmMain.btnUseAbstractClick(Sender: TObject);
var
  NewspaperObj: TNewspaper;
  Info: pchar;
  i: integer;
begin
  NewspaperObj := GetNewspaper;
  if NewspaperObj = nil then
    memo1.Lines.Add('Create newspaper object failed!')
  else
  begin
    try
      GetMem(Info, 255);
      i := NewspaperObj.Read(Info);
      memo1.Lines.Add('Create newspaper object successed!');
      memo1.Lines.Add('read : ' + Info + ' return code : ' + inttostr(i));
    finally
      FreeMem(Info);
      NewspaperObj.Free;
    end;
  end;
end;

// interface方法示例

procedure TfmMain.btnUseInterfaceClick(Sender: TObject);
var
  CircleObj: ICircle;
  Info: pchar;
  i: integer;
begin
  CircleObj := GetCircle;
  if CircleObj = nil then
    memo1.Lines.Add('Create circle object failed!')
  else
  begin
    try
      GetMem(Info, 255);
      i := CircleObj.Scroll(Info);
      memo1.Lines.Add('Create circle object successed!');
      memo1.Lines.Add('scroll : ' + Info + ' return code : ' + inttostr(i));
    finally
      FreeMem(Info);
      CircleObj := nil;
    end;
  end;
end;

// class reference方法示例

procedure TfmMain.btnUseReferenceClick(Sender: TObject);
var
  BallObj : TIBall;
  Info: pchar;
  i: integer;
begin
  BallObj := GetBall.Create;
  if BallObj = nil then
    memo1.Lines.Add('Create ball object failed!')
  else
  begin
    try
      GetMem(Info, 255);
      i := BallObj.Play(Info);
      memo1.Lines.Add('Create ball object successed!');
      memo1.Lines.Add('play : ' + Info + ' return code : ' + inttostr(i));
    finally
      FreeMem(Info);
      BallObj.Free;
    end;
  end;
end;

// .inc文件方法示例

procedure TfmMain.btnUseIncClick(Sender: TObject);
var
  CarObj : TCar;
  Info: pchar;
  i: integer;
begin
  CarObj := GetCar.Create;
  if CarObj = nil then
    memo1.Lines.Add('Create car object failed!')
  else
  begin
    try
      GetMem(Info, 255);
      i := CarObj.Run(Info);
      memo1.Lines.Add('Create car object successed!');
      memo1.Lines.Add('car : ' + Info + ' return code : ' + inttostr(i));
    finally
      FreeMem(Info);
      CarObj.Free;
    end;
  end;
end;
end.
 
UnitPublic.pas源代碼:
unit UnitPublic;
interface
type
// ----- virtual, abstract的類(lèi)定義 -----
  TPaper = class(TObject);
  TNewspaper = class(TPaper)
  public
    function Read(info : pchar) : integer; virtual; abstract;
  end;
implementation
end.
 
UnitIDest.pas源代碼:
unit UnitIDest;
interface
type
  ICircle = interface
  ['{A971701F-96EC-4201-9266-57F982805B6E}']
  function Scroll(Info : pchar) : integer;
  end;
  TIBall = class(TObject)
  public
    constructor Create; virtual; abstract;
    destructor Destroy; virtual; abstract;
    function Play(info : pchar) : integer; virtual; abstract;
  end;
  TBallClass = class of TIBall;
implementation
end.
 
IncDemo.inc源文件:
type
  TCar = class(TObject)
  public
    function Run(info: pchar): integer; virtual; {$IFNDEF INCTEST} abstract; {$ENDIF}
  end;
 
ProDLLDemo.dpr源文件:
library ProDLLDemo;
uses
  SysUtils, Classes,
  UnitDLLDemo in 'UnitDLLDemo.pas',
  UnitIDest in 'UnitIDest.pas';
{$R *.res}
function GetNewspaper : TNewspaper;
begin
  result := TNewspaper.Create;
end;
function GetCircle : ICircle;
begin
  result := TCircle.Create;
end;
function GetBall : TBallClass;
begin
  result := TBall;
end;
function GetCar : TCar;
begin
  result := TCar.Create;
end;
exports
  GetNewspaper,
  GetCircle,
  GetBall,
  GetCar;
end.
 
UnitDLLDemo.pas源代碼:
unit UnitDLLDemo;
{$DEFINE INCTEST}
interface
uses Sysutils, UnitIDest;
{$I IncDemo.inc}
{ ----- 利用純虛和抽象類(lèi)實(shí)現(xiàn) ----- }
type
  TPaper = class(TObject)
  end;
  TNewspaper = class(TPaper)
  public
    constructor Create;
    destructor Destroy;
    function Read(info: pchar): integer; virtual;
  end;
{ ----- 利用接口實(shí)現(xiàn) ----- }
type
  TShape = class(TInterfacedObject)
  end;
  TCircle = class(TShape, ICircle)
  public
    constructor Create;
    destructor Destroy;
    function Scroll(info: pchar): integer;
  end;
{ ----- 利用類(lèi)引用實(shí)現(xiàn) ----- }
type
  TBall = class(TIBall)
  public
    constructor Create;override;
    destructor Destroy;override;
    function Play(info : pchar) : integer; override;
  end;
implementation
{ TNewspaper }
constructor TNewspaper.Create;
begin
  inherited Create;
end;
destructor TNewspaper.Destroy;
begin
  inherited;
end;
function TNewspaper.Read(info: pchar): integer;
var
  str: string;
begin
  if info <> nil then
  begin
    str := self.ClassName;
    strCopy(info, PChar(str));
  end;
  result := 1;
end;
{ TCircle }
constructor TCircle.Create;
begin
  inherited Create;
end;
destructor TCircle.Destroy;
begin
  inherited;
end;
function TCircle.Scroll(info: pchar): integer;
var
  str: string;
begin
  if info <> nil then
begin
    str := self.ClassName;
    strCopy(info, PChar(str));
  end;
  result := 2;
end;
{ TBall }
constructor TBall.Create;
begin
  // inherited Create;
end;
destructor TBall.Destroy;
begin
  // inherited;
end;
function TBall.Play(info: pchar): integer;
var
  str: string;
begin
  if info <> nil then
  begin
    str := self.ClassName;
    strCopy(info, PChar(str));
  end;
  result := 3;
end;
{ ----- 利用Inc文件實(shí)現(xiàn) ----- }
function TCar.Run(info: pchar): integer;
var
  str: string;
begin
  if info <> nil then
  begin
    str := self.ClassName;
    strCopy(info, PChar(str));
  end;
  result := 4;
end;
end.
 
[參考文獻(xiàn)]:
1. Delphi面向?qū)ο缶幊趟枷?第8章,劉藝, 2003.9, 機(jī)械工業(yè)出版社.
2. Delphi 6 Developer‘s Guide, p209, Steve Teixeira, SAMS, 2001.
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
delphi十個(gè)小技巧
Delphi中關(guān)于NMUDP控件的用法(原創(chuàng))
給 TWebBrowser.Document 定義事件
delphi使用IdTCPServer、TIdTCPClient收發(fā)消息
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服