Vor dem Aufruf von QueryInterface sollte die Interface-Variable unbedingt leer sein. Wenn nicht, dann vorher manuell auf NIL setzen.
Vorallem innerhalb von Schleifen, oder wenn die Variable vorher für was Anderes verwendet wurde.
QueryInterface, bzw. GetInterface sind mit Out-Parametern deklariert, womit die Eingabe "verworfen" wird, unter Ausschluß der Referenzzählung.
Sowas kann auch bei anderen Funktionen vorkommen, also immer schön aufpassen.
Zitat:
Delphi-Quellcode:
function TInterfacedObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;
begin
Pointer(Obj) := nil; // <<<<<
...
end;