Einzelnen Beitrag anzeigen

Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#1

Interface referenzen auf gleichheit prüfen?

  Alt 11. Okt 2004, 12:58
Moin,

ich bin gezwungen (von mir selbst) diverse interface-referenzen (COM) zu vergleichen, was sich als schwer heraustellt, da verschiednene ITypen verschiedene binäre-adressen auf ein und das selbe objekt haben.

Stark vereinfachter versuchsaufbau:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  // test typen

  iA = interface
    procedure A;
  end;

  TA= class(TInterfacedObject,iA)
  public
    procedure A;
  end;

  iB = interface(iA)
    procedure B;
  end;

  TAB = class(TA,iB)
  public
    procedure B;
  end;

  {*********************************************}

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    fA:iA;
    fB:iB;
    fRef:TAB;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FRef := TAB.Create; // object erzeugen, das einzige
  fB := fRef; // ref 1
  fA := fRef; // ref 2
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // hier sieht man, dass alle drei referenzen verschiedene addressen haben...
   memo1.Lines.Add(format('ref = %p | a = %p | b = %p',[pointer(fRef),pointer(fA),pointer(fB)]));
  // zB so: ref = 008D24E4 | a = 008D24F0 | b = 008D24F4
end;

{ TA }

procedure TA.A;
begin
  ShowMessage('A');
end;

{ TAB }

procedure TAB.B;
begin
  ShowMessage('B');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  fA.A;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  FB.B;
  FB.A;
end;

end.
das ergebnis wäre zB:
Code:
ref = 008D24E4 | a = 008D24F0 | b = 008D24F4
und ich sehe auch ein, dass das intern für die COM implementierung irgendwie so sein muss...

...ABER wie vergleicht man diese referenzen so, dass TRUE bei rumm kommt?

Danke, in erwartung
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat