Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Interface-Struktur - Loader für DLLs (https://www.delphipraxis.net/162348-interface-struktur-loader-fuer-dlls.html)

slemke76 18. Aug 2011 13:33

Interface-Struktur - Loader für DLLs
 
Hallo zusammen,

nachdem mir hier im Forum Ende 2009 bzgl. der Implementation einer Plugin-Struktur für DLLs supergut geholfen wurde, möchte ich das Programm jetzt gerne erweitern.
Es geht darum, mit einer Routine verschiedene DLLs mit verschiedenen Interfaces einzulesen.

Im Moment sieht es so aus, dass es eine Interface-Deklaration gibt:
Delphi-Quellcode:
type
  IImport = interface(IInterface)
    ['{6E19FD1D-E50C-4701-8710-611F398DC4BE}']
    function checkModuleStatus():TModuleStatus;
    procedure DoImport();
    procedure SetParameter(name: PChar; value: PChar);
  end;
Die Instanz wird nach einem "Supports" geholt:

Delphi-Quellcode:
...
libs[j]:=LoadLibrary(@dllname[1]);
if libs[j] <> 0 then GetInterface:=GetProcAddress(libs[j], 'GetInterface');
if (not Supports(GetInterface, IImport)) then GetInterface:=nil;
if Assigned(GetInterface) then begin
   Adapter:=GetInterface();
....
Das Programm wird jetzt um eine weitere (komplett andere) Plugin-Struktur ergänzt.
Dafür habe ich wiederum ein Interface deklariert:

Delphi-Quellcode:
type
  IExport = interface(IInterface)
    ['{70D193B5-0C3A-4960-ACE9-9103959AA06E}']
    procedure tuwasanderes();
  end;
Dir Frage ist jetzt, wie bekomme ich meine DLL-Lade-Routine in eine Funktion ausgelagert ?
Das Problem ist, dass ich für den Vergleich mittels "Supports" die Interface-Deklaration benötige - entweder IImport oder IExport.

Was ich schon probiert habe, ist so etwas:
Delphi-Quellcode:
function DLLLoader(useInterface: IInterface)
...
if (not Supports(GetInterface, useInterface)) then GetInterface:=nil;
...
Geht aber nicht; "es gibt keine überladene Funktion von Supports...".

Wie löse ich das Problem ?

Danke,
Sebastian

shmia 18. Aug 2011 17:04

AW: Interface-Struktur - Loader für DLLs
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt übrigens von Microsoft ein eigenes System für die Entdeckung von Plugins ("COM Component Categories").
Diese ActiveX-DLLs müssen nicht in einem best. Verzeichnis liegen, sondern einfach nur registriert sein.
Jedes Plugin registriert sich in einer oder mehreren COM Categorien.
Eine ActiveX-DLL kann auch mehrere Plugins enthalten.

Die Hauptanwendung schaut dann nach, ob in einer bestimmten COM Categorie etwas registiert wurde und kann so die Plugins laden ohne den Pfad der ActiveX-DLL zu kennen.

slemke76 20. Jun 2013 20:20

AW: Interface-Struktur - Loader für DLLs
 
Liste der Anhänge anzeigen (Anzahl: 1)
** bump ** ;-)

Hallo zusammen,

ich bin heute mal wieder über den Code gestolpert - leider habe ich damals keine Lösung an das Problem bekommen.

Aus diesem Grund habe ich nochmal ein Beispiel-Projekt zusammengestellt, in der Hoffnung, dass mir jemand helfen kann. Über die COM Objekte wie im vorherigen Post geschrieben, möchte ich eigentlich nicht so gerne arbeiten.

Ich habe alles soweit zusammen"gestrichen" wie es ging - das Original-Projekt benutzt Threads, einen für den Import, einen für den Export - das habe ich im Beispiel einfach als Klassen umgebaut.

Es gibt im Hauptprojekt also eine TBaseClass, in der unter anderem die Funktion "DLLLoader" drin ist.
Die TExportClass und TImportClass sind von der TBaseClass abgeleitet und sollen jeweils DLLs laden - dafür würde ich natürlich gerne gemeinsamen Code aus der TBaseClass nutzen - die Logik ist in beiden Fällen gleich, das Interface (IExport und IImport) ist natürlich verschieden.

Das Problem sind jetzt solche Dinge in der DLLLoader-Funktion:
Delphi-Quellcode:
TFNGetInterface = function(): IImport; stdcall;
oder auch

Delphi-Quellcode:
if (not Supports(GetInterface, IImport)) then GetInterface:=nil;
Es gibt beim Compilieren *keine* Fehlermeldung, aber die Export.DLL wird nicht korrekt geladen (klar...).

Kann mir jemand einen Schubser in die richtige Richtung geben?

Grüße
Sebastian


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