Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arbeit mit Interfaces (https://www.delphipraxis.net/196854-arbeit-mit-interfaces.html)

Lemmy 25. Jun 2018 18:05

Delphi-Version: 7

Arbeit mit Interfaces
 
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?

Schokohase 25. Jun 2018 18:17

AW: Arbeit mit Interfaces
 
Lieb nachfragen geht aber anders. So würde es knallen, wenn du keine
Delphi-Quellcode:
IFoo
Referenz bekommst.

Entweder vorher auf
Delphi-Quellcode:
nil
prüfen oder mit
Delphi-Quellcode:
Supports
und die
Delphi-Quellcode:
Boolean
Rückgabe auswerten.

Lemmy 25. Jun 2018 18:51

AW: Arbeit mit Interfaces
 
Zitat:

Zitat von Schokohase (Beitrag 1405776)
Lieb nachfragen geht aber anders. So würde es knallen, wenn du keine
Delphi-Quellcode:
IFoo
Referenz bekommst.

Entweder vorher auf
Delphi-Quellcode:
nil
prüfen oder mit
Delphi-Quellcode:
Supports
und die
Delphi-Quellcode:
Boolean
Rückgabe auswerten.

sorry, das habe ich einfach unterschlagen - Rückgabewert von QueryINterface würde ich im Echtfall natürlich abprüfen

jaenicke 25. Jun 2018 19:11

AW: Arbeit mit Interfaces
 
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);


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 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