Forum: Object-Pascal / Delphi-Language
Delphi
by Uwe Raabe,
10. Okt 2012
Der Kommentar ist offenbar erst seit XE enthalten.
Forum: Object-Pascal / Delphi-Language
Delphi
by Uwe Raabe,
10. Okt 2012
War im Beispiel der falsche Overload der Funktion - der richtige enthält übrigens eine entsprechende Warnung:
function Supports(const Instance: TObject; const IID: TGUID): Boolean;
var
Temp: IInterface;
begin
// NOTE: Calling this overload on a ref-counted object that has REFCOUNT=0
// will result in it being freed upon exit from this routine.
Result := Supports(Instance, IID,...
Forum: Object-Pascal / Delphi-Language
Delphi
by Uwe Raabe,
10. Okt 2012
Dieses Vorgehen ist aber nicht in jedem Fall anwendbar. Man muss sich schon entscheiden, ob man nur mit Interface-Referenzen und Referenzzählung arbeiten will, oder ob man ohne Referenzzählung selber die Objekt-Instanzen verwalten will. Für beide Vorgehen gibt es je nach Anwendungsfall gute Gründe. Man muss dann nur die passende Elternklasse verwenden.
Forum: Object-Pascal / Delphi-Language
Delphi
by Uwe Raabe,
10. Okt 2012
Offensichtlich war meine Erklärung nicht verständlich genug: Es ist nicht das QueryInterface was die Referenzzählung auslöst, sondern die Implementierung des Supports ohne out-Parameter:
function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
var
Temp: IInterface;
begin
Result := Supports(Instance, IID, Temp);
end;
Forum: Object-Pascal / Delphi-Language
Delphi
by Uwe Raabe,
10. Okt 2012
Die anderen haben es ja schon erklärt. Das Support ohne out-Parameter ruft intern das mit out-Parameter auf, wobei das temporäre Interface beim Verlassen der Funktion freigegeben wird. Da a ein TFirstSecond ist, was von TInterfacedObject abgeleitet wurde, ist der interne Referenzzähler nach dem Create Null. Wenn jetzt die implizite Referenzzählung ein Add/Release ausführt, wird beim Release der...