Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Supports verständnis problem

  Alt 30. Mai 2014, 10:12
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Mai 2014 um 10:19 Uhr)
  Mit Zitat antworten Zitat