編寫能被com組件調用的客戶端

共分兩步

一.寫一個繼承自toleserver的類

unit Unit4;

interface

uses
  OleServer, classes, Project1_TLB, Activex;

type
  TxzmOleServer = class(TOleServer)
  private
    Folexzm: ixzmtest;
    procedure InitServerData; override;
    procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
    procedure Setolexzm(const Value: ixzmtest);

  public
    FMyServerData: TServerData;
    constructor Create(AOwner: TComponent; AMyServer: ixzmtest);
    destructor Destroy; override;

    // NOTE: If derived class is generated by TLIBIMP or ImportTypeLibraryCodeGenerator,
    //       the derived class will also expose a 'ConnectTo(interface)' function.
    //       You must invoke that method if you're using 'ckAttachToInterface' connection
    //       kind.
    procedure Connect; override;
    procedure Disconnect; override;
    property olexzm: ixzmtest read Folexzm write Setolexzm;

  end;


implementation

{ TxzmOleServer }
uses
  dialogs, sysutils, Unit3;

procedure TxzmOleServer.Connect;
begin
  self.ConnectEvents(olexzm);
end;

constructor TxzmOleServer.Create(AOwner: TComponent; AMyServer: ixzmtest);
begin
  olexzm:= AMyServer;
  inherited create(AOwner);

end;

destructor TxzmOleServer.Destroy;
begin

  inherited;
end;

procedure TxzmOleServer.Disconnect;
begin
  self.DisconnectEvents(olexzm);
end;

procedure TxzmOleServer.InitServerData;
begin
  FMyServerData.ClassID:= CLASS_xzmtest;
  FMyServerData.IntfIID:= IID_Ixzmtest;
  FMyServerData.EventIID:= DIID_IxzmtestEvents;
  FMyServerData.InstanceCount:= 0;
  self.ServerData:= @FMyServerData;
  inherited;

end;

procedure TxzmOleServer.InvokeEvent(DispID: TDispID;
  var Params: TVariantArray);
begin
  inherited;
  form3.InvokeEvent(dispid, params);
end;

procedure TxzmOleServer.Setolexzm(const Value: ixzmtest);
begin
  Folexzm := Value;
end;

end. 

二.建立一個接收com組件事件的界面

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Project1_TLB, StdCtrls, Unit4, activex, oleserver;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FOlexzm: ixzmtest;
    Fxzmoleserver: TxzmoleServer;
    { Private declarations }
  public
    { Public declarations }
    procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray);
    property Olexzm: ixzmtest read FOlexzm write FOlexzm;
    property xzmOleServer: TxzmoleServer read Fxzmoleserver write Fxzmoleserver;
  end;

var
  Form3: TForm3;

implementation


{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
begin
  Olexzm:= coxzmtest.Create as ixzmtest;
  xzmoleserver:= Txzmoleserver.Create(self, olexzm);
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  xzmoleserver.Connect;
end;

procedure TForm3.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
var
  i: integer;
begin
  memo1.Lines.Add(inttostr(dispid));
  for i:= 0 to length(params) - 1 do
  begin
    memo1.Lines.Add('參數'+inttostr(i)+':'+params[i]);
  end;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  xzmoleserver.Disconnect;
  xzmoleserver.Free;
  olexzm:= nil;

end;

end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章