![]() |
Fremde DLL per COM verwenden - OLE-Server-Proxy erstellen
Hallo!
Eines vorne weg: Ich bin kein echter Experte für DLLs und COM. Ich weiß (grob) um was es geht. Aber das meiste habe ich mir zusammen gesucht, als ich es brauchte und weiß heute leider nicht mehr was ich gemacht habe... :-) Also: In einem meiner Programme verwende ich ein Objekt, das in einer fremden (nicht von mir erstellt) DLL zur Verfügung gestellt wird. Den Zugriff auf diese Funktionen erhalte ich per COM. Als ich das Programm geschrieben haben, habe ich mit Hilfe von Delphi aus der DLL und der zugehörigen TLB die Datei EineDLLLib_TLB.pas erstellt. Diese Unit enthält die Deklarationen für die Interfaces zum Zugriff auf die DLL-Funktionen. Zusätzlich war ist in dieser Unit noch eine "OLE-Server-Proxy-Klassendeklaration" vorhanden:
Delphi-Quellcode:
Mit der Klasse TKDF konnte ich mir dann einfach ein Objekt erzeugen und so auf die Funktionen der DLL zugreifen. Soweit so gut.
// *********************************************************************//
// OLE-Server-Proxy-Klassendeklaration // Server-Objekt : TKDF // Hilfe-String : KDF Class // Standard-Interface: IKDF // Def. Intf. DISP? : No // Ereignis-Interface: // TypeFlags : (2) CanCreate // *********************************************************************// {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} TKDFProperties= class; {$ENDIF} TKDF = class(TOleServer) private FIntf: IKDF; ... Nun gibt es eine neue Version der DLL und ich wollte für diese wieder eine _TLB Datei erstellen um das Objekt nutzen zu können. Dafür habe ich ich die .tlb Datei in Delphi (2006) geöffnet und registriert. Dadurch wird automatisch eine _TLB Datei erzeugt. Die Datei enthält auch so ziemlich alles, was die alte _TLB Datei enthalten hat, nur die Deklaration für den OLE-Server-Proxy nicht. Ich kann somit kein Objekt erzeugen. Ich habe daraufhin noch einmal versucht mit der alten .dll und der alten .tlb eine _TLB.pas Datei zu erstellen. Das klappt auch, nun fehlt aber auch hier die Deklaration für den OLE-Server-Proxy. Ich muss beim ersten Mal also irgendwas anders gemacht haben. Ich finde ahber leider nicht mehr raus, was... :-( Kann mir jemand sagen, was ich falsch mache und ich eine _TLB.pas Datei erstelle, die ein OLE-Server-Proxy Deklaration enthält? Ich verwende wie gesagt Delphi 2006. Soweit ich mich erinnere habe ich die _TLB.pas beim erste Mal auch schon mit Delphi 2006 erzeugt. Mit Delphi 6 erhalte ich das gleiche Ergebnis. Ich habe auch schon versucht tlibimp.exe manuell zu verwenden, aber das zeigt auch kein anderes Ergebnis. Weiß jemand was zu tun ist? Besten Dank Ares |
Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
Es gibt da noch einen Schalter das Komponentenwrapper erzeugt werden sollen.
|
Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
Hallo! Vielen Dank für den Tipp, aber wo genau finde ich diesen Schalter? Wenn ich die .tlb Datei mit Delphi öffne finde ich im Typbibliotheks-Editor keinen solchen Schalter. Die Hilfe gibt hierzu leider auch keinen Hinweis...
|
Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
Hallo!
Mir ist es leider immer noch nicht gelungen einen Schalter zum Erstellen eines Komponentenwrappers zu finden. Die Suche zu diesem Stichwort liefert nur einige Treffer die etwas sagen wie "Mach den Haken bei Wrapper erstellen weg...". Das hilft mir leider nicht herauszufinden wo ich diesen Haken finde. Bei Google habe ich folgendes gefunden: Zitat:
Wenn mir also jemand sagen könnte, wie ich einen Komponentenwrapper erstelle wäre das wirklich klasse! Besten Dank Ares |
Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
Du solltest deinen Programcode umstellen anstatt der alten Klasse TKDF nachzutrauern.
Das geht so:
Delphi-Quellcode:
uses ..., EineDLLLib_TLB;
TForm1 = class(TForm) private F_KDF : IKDF; // ein Interface-Pointer procedure CreateKDF; // "Kraft durch Freude" Objekt erzeugen procedure MachWas; end; procedure TForm1.CreateKDF; begin // Interface Objekt erzeugen F_KDF := CoKDF.Create; // das war einfach, oder ? end; procedure TForm1.MachWas; begin if not Assigned(F_KDF) then CreateKDF; // jetzt mit F_KDF arbeiten F_KDF.OpenFile(....); // fiktive Methode - frei erfunden // du brauchst kein .Free oder ähnliches aufrufen // F_KDF wird automatisch von der VCL freigegeben end; |
Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
Zitat:
Ich nehme an Du sprichst das Thema early/late binding an. Es gibt einige Vorteile die für late binding sprechen. Viele aber für early binding. Siehe z.b. ![]() War wohl keine Hilfe für das ursprüngliche Problem aber immerhin. Habe leider "nur" Delphi 7. Und dort findet sich der Schalter. |
Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
Zitat:
Ein OLE Objekt muss eine ganze Menge weitere Interfaces unterstützen, damit es wirklich ein OLE-Objekt wird. (IDataObject, IOleContainer, IParseDisplayName, IPersist, ....) Diese ganzen Standard-Interfaces erlauben einem Objekt sich selbst anzuzeigen, sich selbst in einem Stream zu speichern, u.s.w. Wenn man bei einer CoClass das Flag "Steuerlement" ("Control") setzt, versucht Delphi beim Import der TLB automatisch einen OLE-Wrapper herumzupacken. Wahrscheinlich hat der Author der DLL genau diesen Fehler gemacht. Später hat er wohl seinen Fehler erkannt und das Flag wieder entfernt. Folge: Delphi erzeugt keine von TOleServer abgeleitete Klasse mehr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz