Danke für die Antworten, das mit Referenzzählung hätte mir auffallen müssen, aber
was ist mit dem zweiten Teil der Frage?
Wie und warum genau verändert Supports() die Instanz so das bei dem Aufruf von
Supports(a, ISecond) als Rückgabe Wert false rauskommt?
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:
Delphi-Quellcode:
function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
var
Temp: IInterface;
begin
Result := Supports(Instance, IID, Temp);
end;
Nach dem
a := TFirstSecond.Create
ist der Referenzzähler von a = 0. Beim ersten Aufruf von Supports wird in der Support-Funktion für Temp ein implizites AddRef und Release ausgelöst, da beim Verlassen der Funktion alle lokalen Interface-Variablen auf nil gesetzt werden. Beim Release springt der Referenzzähler wieder auf 0 und die Instanz wird freigegeben. Danach verweist a nicht mehr auf eine gültige Instanz und es geschehen nicht vorhersagbare Dinge.