Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi COM-Automationsobjekte aus dynamisch geladener Dll (https://www.delphipraxis.net/139877-com-automationsobjekte-aus-dynamisch-geladener-dll.html)

fajac 7. Sep 2009 14:42


COM-Automationsobjekte aus dynamisch geladener Dll
 
Hallo COM-Experten!

folgendes Problem: Meine Applikation nutzt eine Bibliothek eines Drittherstellers (D.), realisiert als COM-Automationsobjekte in Dlls. Da dieser Hersteller relativ häufig neue Versionen herausbringt, habe ich die Zugriffe auf seine Bibliotheken in eigene Dlls gekapselt, die ihrerseits COM-Automationsobjekte exportieren. Auf diese Weise kann ich meine Applikation einfach durch Austausch meiner Wrapper-Dlls an neue Versionen der D.-Bibliothek anpassen. So weit so gut.

Beim letzten Update hat D. bei einem großen Versionssprung für alle Objekte neue GUIDs eingeführt. Da die Objekte und Methoden aber aufrufkompatibel geblieben sind, war das kein allzu großes Problem - Typelib neu importieren, Wrapper-Dlls neu kompilieren - fertig. Klappt auch soweit.

Allerdings hat sich jetzt eine neue Situation ergeben. Durch die neuen GUIDs ist es möglich, zwei Versionen der D.-Bibliotheken gleichzeitig zu installieren, wegen unterschiedlicher Features beider Versionen auch wünschenswert. Ich kann auch nach wie vor durch Neuregistrieren der Wrapper-Dlls auf eine bestimmte Version zugreifen - aber eben nicht auf beide gleichzeitig, da das Interface meiner Wrapper ja gleich geblieben ist und ich immer nur einen registrieren kann.

Jetzt die Frage : Ist es möglich, eine COM-Automations-dll dynamisch mit LoadLibrary zu laden und deren exportierte Objekte zu erzeugen? Das würde es mir ermöglichen, zwei Objekte mit gleichem Interface, aber unterschiedlicher Implementierung zu instanziieren. Habs bisher leider erfolglos probiert. Das Laden der Dlls ist kein Problem, aber wie komme ich an meine Objekte?

himitsu 7. Sep 2009 14:52

Re: COM-Automationsobjekte aus dynamisch geladener Dll
 
Du könntest doch auch in deiner DLL beim Laden angeben, welche Version verwendet werden soll.

Also in diesem Fall in deiner DLL alle nötigen Versionen der D.Lib importieren
und dann z.B. über ein neues Property oder so einstellen was nun grad verwendet wird.

Anhand dieser Einstellung wählt dann dein Wrapper aus, welche Interfaces der D.-Lib grade verwendet werden sollen.

sirius 7. Sep 2009 14:58

Re: COM-Automationsobjekte aus dynamisch geladener Dll
 
mit "LoadTypeLib"

fajac 7. Sep 2009 15:04

Re: COM-Automationsobjekte aus dynamisch geladener Dll
 
@himitsu:
Das ist leider nicht praktikabel.
Das Einbinden zweier Typelibs selbst wäre wohl kein Problem, aber:
Innerhalb des Wrappers werden Myriaden von Objekten aus den D.-Bibliotheken über deren GUIDs erzeugt und referenziert. Die GUIDs selber werden über Namen aus der *_TLB-Unit geholt. Wenn ich zwei *_TLB-Units lade, muss ich alle diese Referenzen auf genau eine von denen qualifizieren... :pale:
@sirius:
schau ich mir mal an, danke

himitsu 7. Sep 2009 15:54

Re: COM-Automationsobjekte aus dynamisch geladener Dll
 
GUIDs sind doch String, bzw. ein Record, niwa?

Wenn der verwendete Teil der D.-Lib auch noch gleich ist und sich wirklich nur die GUIDs ändern, dann könnte man doch versuchen diese über eine Variable zu ände ...


der Compiler macht dieses schonmal mit, aber ich weiß nicht, ob/wie es dann auch läuft.
Delphi-Quellcode:
var MyInterfaceGUID: String;

type IMyInterface = interface
  [MyInterfaceGUID]
    //...
  End;

procedure LoadV1;
begin
  MyInterfaceGUID := '{0F5C6D07-22A8-4AF6-81E7-2092E79C4A52}' ;
end;

procedure LoadV2;
begin
  MyInterfaceGUID := '{E4FFBD30-775C-43E2-957B-D7856E01D587}';
end;

fajac 8. Sep 2009 09:49

Re: COM-Automationsobjekte aus dynamisch geladener Dll
 
Um diesen Thread vorläufig abzuschließen: Ich habe das Problem lösen können.

Ich habe einfach meinen Wrapper-Dlls eine weitere exportierte Funktion hinzugefügt, die ein neues Objekt erzeugt und als Interfacezeiger zurückgibt...manchmal kann das Leben so einfach sein! :-D

Trotzdem vielen Dank fürs Feedback!


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