AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi COM-Automationsobjekte aus dynamisch geladener Dll
Thema durchsuchen
Ansicht
Themen-Optionen

COM-Automationsobjekte aus dynamisch geladener Dll

Ein Thema von fajac · begonnen am 7. Sep 2009 · letzter Beitrag vom 8. Sep 2009
Antwort Antwort
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#1

COM-Automationsobjekte aus dynamisch geladener Dll

  Alt 7. Sep 2009, 15:42
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: COM-Automationsobjekte aus dynamisch geladener Dll

  Alt 7. Sep 2009, 15:52
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: COM-Automationsobjekte aus dynamisch geladener Dll

  Alt 7. Sep 2009, 15:58
mit "LoadTypeLib"
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#4

Re: COM-Automationsobjekte aus dynamisch geladener Dll

  Alt 7. Sep 2009, 16:04
@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...
@sirius:
schau ich mir mal an, danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: COM-Automationsobjekte aus dynamisch geladener Dll

  Alt 7. Sep 2009, 16:54
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#6

Re: COM-Automationsobjekte aus dynamisch geladener Dll

  Alt 8. Sep 2009, 10:49
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!

Trotzdem vielen Dank fürs Feedback!
  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 08:41 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