QueryInterface benutzt der Compiler bei
as-Casts zu Interfaces um zu kucken, ob der zu castende Typ überhaupt dieses Interface implementiert. _AddRef und _Release sind zur Referenzzählung da, wenn die Referenzen auf das Interface auf 0 fallen, gibt es sich automatisch frei: GC für faule -> ausschalten wenn möglich.
Ganz einfach gehts so:
Delphi-Quellcode:
type
TMyInterfacedClass = class(TInterfacedObject, IMyInterface)
...
end;
Wenn ich in Delphi mit Interfaces arbeite, benutze ich immer das als Basisklasse:
Delphi-Quellcode:
type
IHAMInterface = interface
['{F7509748-217A-42EB-B6FB-A45C25310F8A}']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
procedure AllowDestruction;
end;
THAMObject = class(TObject, IHAMInterface)
private
fDestroying: Boolean;
protected
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; virtual; stdcall;
function _Release: Integer; virtual; stdcall;
procedure AllowDestruction;
public
constructor Create; virtual;
property Destroying: Boolean read fDestroying write fDestroying;
end;
procedure THAMObject.AllowDestruction;
begin
fDestroying := True;
end;
constructor THAMObject.Create;
begin
inherited;
end;
function THAMObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function THAMObject._AddRef: Integer;
begin
Result := 1;
end;
function THAMObject._Release: Integer;
begin
Result := 1;
if fDestroying then
Free;
end;
@mkinzler: Eigentlich sinds doch Methoden von TInterfacedObject?