Var-Parameter müssen immer vom selben Typ sein, weswegen Supports so nicht funktionieren könnte (außer man hätte mit bissl Compilermagic nachgeholfen).
Also wurde der Var-Parameter typlos angelegt und intern wird "blind" auf IInterface gegastet, da nicht geprüft werden kann, was wirklich als Parameter reingegeben wurde.
Im Grunde bekommt man bei allem, was zufällig 4 Byte (8 bei Win64) groß ist, das Interface reingeschoben.
Und bei Kleinerem bekommt man eventuelle Zugriffsverletzungen, oder zumindestens einen Buffer-Overrun.
Fazit: Du mußt prüfen.
PS: Bei meinem aktuellen Projekt geh ich einen anderen/neueren Weg.
Es gibt da z.B. folgende Methoden und vorallem die Letzte ist Interessanter.
Delphi-Quellcode:
function SupportsIDEService(Service: TGUID): Boolean; inline;
function GetIDEService (Service: TGUID): IInterface; inline;
function TryGetIDEService (Service: TGUID; out Intf): Boolean; inline;
property IDEServices: IBorlandIDEServices read GetIDEServices;
function IDEService<I: IInterface>: I;
Dort wird dann vir
RTTI die
GUID ausgelesen und entsprechend verwendet.
Im Prinzip wäre auch sowas möglich, wie
function Supports<I: IInterface>: Boolean;
, aber da Delphi die Interfaces bai Übergabe an einen GUD-Parameter automatisch "konvertiert", lohnt sich das nicht.
Aber
function Supports<I: IInterface>(var Intf: I): Boolean;
müsste auch funktionieren.
Was macht TryCast?
[edit] Achso, das ist fast wie ein AS (DirectCast), nur ohne
Exception.
Aber gibt es auch den "richtigen2 Interfacetyp als Result zurück?
[edit2] Es ist also etwas wie mein
IDEService<I: IInterface>: I; , nur daß ich eine
Exception werfe und die stattdessen ein INothing (in Delphi wohl besser ein nil) zurückgeben.