Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.287 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.
Ein Therapeut entspricht 1024 Gigapeut.

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