Ja und, schau dir obigen Code mal genaur an
Delphi-Quellcode:
function Compare(const A,B: IInterface): Boolean;
var
AI,BI: IImpelementor;
begin
Result := (A.QueryInterface(AI, IImplementor) = H_OK) and
(B.QueryInterface(BI, IImplementor) = H_OK) and
(AI.Object.ClassType = BI.Object.ClassType);
end;
vergleicht die Klassen, und daraus wird
Delphi-Quellcode:
function Compare(const A,B: IInterface): Boolean;
var
AI,BI: IImpelementor;
begin
Result := (A.QueryInterface(AI, IImplementor) = H_OK) and
(B.QueryInterface(BI, IImplementor) = H_OK) and
(AI.Object = BI.Object);
end;
um die zu implementierenden Objecte zu vergleichen. Bei TRUE wird das Interface in A und B durch das selbe Object implementiert, ergo A und B stellen das selbe Object dar, auch WENN eben Pointer(A) == Pointer(B) FALSE ist. Ich hätte gedacht das nach dem Studium meines obigen Postings das eigentlich trivial ist
und jeder das so ableiten kann.
Da wir das absichtlich so konstruiert haben muß das funktionioren, es basiert also nicht auf undokumentierten Annahmen wie Delphis Compiler intern was macht.
Gruß Hagen