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}