AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TGUID von Interface-Instanz herausfinden

Ein Thema von TiGü · begonnen am 7. Mai 2014 · letzter Beitrag vom 12. Mai 2014
Antwort Antwort
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: TGUID von Interface-Instanz herausfinden

  Alt 8. Mai 2014, 08:15
Das klingt ja alles sehr kompliziert. Ginge es nicht so wie Der Schöne Günther bereits schrieb:
Delphi-Quellcode:
function TMyList.GetInterfaceGUID(const AInterfaceInstance : IMainInterface) : TGUID;
begin
  result := GetTypeData(TypeInfo(AInterfaceInstance))^.Guid;
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TGUID von Interface-Instanz herausfinden

  Alt 8. Mai 2014, 09:01
Vielen Dank für den bisherigen Input.
Ich ahnte schon, dass es unmöglich und/oder kompliziert sein würde.

Das klingt ja alles sehr kompliziert. Ginge es nicht so wie Der Schöne Günther bereits schrieb:
Delphi-Quellcode:
function TMyList.GetInterfaceGUID(const AInterfaceInstance : IMainInterface) : TGUID;
begin
  result := GetTypeData(TypeInfo(AInterfaceInstance))^.Guid;
end;
Leider zickt da mein XE3: [dcc32 Error] List.pas(51): E2133 TYPEINFO standard function expects a type identifier

Sowas hatte ich nämlich auch schon im Sinn und bin an ähnlichen Fehlermeldungen gescheitert.

@Günther: Wenn man eh den genauen Typ weiß, braucht man auch keine RTTI:
Delphi-Quellcode:
var
  InterfaceGUID : TGUID;
begin
  InterfaceGUID := GetTypeData(TypeInfo(IMainInterface))^.Guid;
  InterfaceGUID := IMainInterface;

Man muss dazu sagen, dass ich von einer C++-DLL diese Instanzen erhalte, es sind also leider keine Delphi-Objekte.
Ich weiß halt nur, dass diese Instanzen das IMainInterface implementieren.
Nun gilt es herauszufinden, welches andere Interface sie noch unterstützen, um ihre Aufgabe zweifelsfrei zu identifizieren (Child1 bis Child3 im Beispiel).

Oder um es etwas konkreter zu machen:
Delphi-Quellcode:
  ICanDrive = interface(IUnknown)
    [SID_DRIVE]
  end;

  IAmACar = interface(IUnknown)
    [SID_CAR]
  end;

  IAmATruck = interface(IUnknown)
    [SID_TRUCK]
  end;

  IAmAMoped = interface(IUnknown)
    [SID_MOPED]
  end;
Ich erhalte ICanDrive-Instanzen und muss schauen ob es nun ein Auto, LKW oder Mofa ist.
Mit if-else-Supports-Check gehts es zwar auch, ist aber halt sehr wartungsanfällig und fehlerbehaftet.

Geändert von TiGü ( 8. Mai 2014 um 11:01 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TGUID von Interface-Instanz herausfinden

  Alt 8. Mai 2014, 09:13
Nachtrag:
Beim Schreiben des vorigen Beitrages ist mir diese Lösung eingefallen:
Delphi-Quellcode:
const
  MyDriveInterfaces : array[1..3] of TGUID = (SID_CAR, SID_TRUCK, SID_MOPED);

function TMyList.GetInterfaceGUID(const AInterfaceInstance : ICanDrive) : TGUID;
var
  InterfaceGUID: TGUID;
begin
  for InterfaceGUID in MyDriveInterfaces do
  begin
    if Supports(AInterfaceInstance, InterfaceGUID) then
      Result := InterfaceGUID;
  end;
end;
Zwar muss man bei neuen oder veralteten Interfaces mitdenken und das Array anpacken, aber irgendeinen Tod muss man anscheinend immer sterben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TGUID von Interface-Instanz herausfinden

  Alt 8. Mai 2014, 10:32
Damit bekommst du aber nur raus, ob die Instanz in dem Interface das kann, aber nicht ob das auch wirklich grade genau dieser Interfacetyp ist.

Beim Auflisten der RTTI hatte ich mir grade einen Code zusammengebastelt, um die "unterstüttzten" Interfaces einer Interfaceinstanz auszulesen.
(leider fehlen da Interfaces, welche zwar über Supports gefunden werden, aber die eigentlich in einer anderen Objektinstanz sind, welche dort allerdings verlinkt wird)

Aber der Code liefert erstmal fast alle IIDs/GUIDs und diese könnte man man dann via Suppots/QueryInterface abfragen und dann die zurückgegebenen Interfaceinstanzen prüfen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TGUID von Interface-Instanz herausfinden

  Alt 8. Mai 2014, 10:50
Damit bekommst du aber nur raus, ob die Instanz in dem Interface das kann, aber nicht ob das auch wirklich grade genau dieser Interfacetyp ist.
Aber ist das nicht das Gleiche?

Also um bei den Beispiel mit den Fahrzeugen zu bleiben, ich weiß das die C++Klassen immer das ICanDrive implementieren.
Zusätzlich dann noch eins, um ihre wahre Funktion zu definieren.

Nie aber implementiert eine dieser C++-Klassen gleichzeitig IAmACar und IAmATruck.

Code:
class Car : public ICanDrive, public IAmACar
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz