AGB  ·  Datenschutz  ·  Impressum  







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

Arbeit mit Interfaces

Ein Thema von Lemmy · begonnen am 25. Jun 2018 · letzter Beitrag vom 25. Jun 2018
Antwort Antwort
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#1

Arbeit mit Interfaces

  Alt 25. Jun 2018, 19:05
Delphi-Version: 7
Servus,

nehmen wir an ich will für das einbinden von DLLs ein kleines Plugin-System machen.

Delphi-Quellcode:
type
  IPlugin = Interface
  []
    procedure Init;
    procedure finalize;
   ....
  end;

  IFoo = interface
  []
    procedure DoSomething;
  end;
die DLL exportiert

Delphi-Quellcode:
  function GetPlugin: IPlugin
  begin
    result := ....
  end;
IPlugin soll dabei als allgemeines Interface dienen um so Dinge wie evtl. notwendige DB-Zugriff zu initialisieren bzw. allgemeine Initialisierung und Freigaben in der DLL zu kapseln. IFoo ist die eigentliche "Funktion" der DLL. Kann ich diese einfach "Huckepack" übergeben:

DLL:
Delphi-Quellcode:
 
type
  TFoo = class(TInterfacedObject, IPlugin, IFoo)
  ....
  end;

und dann in der Anwendung:


Delphi-Quellcode:
Type
  TFoo = function: IPlugin;


var
  bar: TFoo;
  plugin: IPlugin;
  Foo: IFoo;
begin
  bar := GetProcAdress(Handle, 'GetPlugin');
  if Assigned(bar) then
  begin
    plugin := bar();
    plugin.init;
    plugin.QueryInterface(IFoo, Foo);
    
    Foo.DoSomething;
  
  end;
end;

Sprich: Darf ich hier lieb nachfragen, ob mein benötigtes Interface von der DLL implementiert wird um dann damit weiter zu arbeiten oder spricht irgend etwas dagegen?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: Arbeit mit Interfaces

  Alt 25. Jun 2018, 19:17
Lieb nachfragen geht aber anders. So würde es knallen, wenn du keine IFoo Referenz bekommst.

Entweder vorher auf nil prüfen oder mit Supports und die Boolean Rückgabe auswerten.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Arbeit mit Interfaces

  Alt 25. Jun 2018, 19:51
Lieb nachfragen geht aber anders. So würde es knallen, wenn du keine IFoo Referenz bekommst.

Entweder vorher auf nil prüfen oder mit Supports und die Boolean Rückgabe auswerten.
sorry, das habe ich einfach unterschlagen - Rückgabewert von QueryINterface würde ich im Echtfall natürlich abprüfen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Arbeit mit Interfaces

  Alt 25. Jun 2018, 20:11
Ja, das geht so. Wir sind dabei aber einen Schritt weiter gegangen und haben Wrapper gebaut. So gibt es in der DLL und in der Anwendung jeweils eine Klasse, die Interfaces mit beliebigen Parametern gegenseitig, aber auch innerhalb der DLL oder Anwendung abrufen kann.

Dafür gibt es eine Registrierungsroutine in der DLL, die in einer separaten Unit steht. Es reicht daher diese Unit in die DLL einzubinden. Dann findet die Hostanwendung diese exportierte Funktion und übergibt an diese das Host-Interface. Darüber wird dann auch ein Client-Interface der DLL übergeben.

Und nun kann man darüber generisch nach einem bestimmten Interface-Typ fragen und Parameter mitgeben. Die Plugin-Klasse holt sich aus dem generischen Typ die GUID und fragt mit dieser GUID über das Interface die Hostanwendung nach einer passenden Instanz usw.

Beispiel:
Delphi-Quellcode:
IntParam := TParam<Integer>.Create(42);
IntfRef := TApp.Get<ITestPlugin>(IntParam);
Sebastian Jänicke
AppCentral

Geändert von jaenicke (25. Jun 2018 um 20:14 Uhr)
  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 00:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz