Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fremde DLL per COM verwenden - OLE-Server-Proxy erstellen (https://www.delphipraxis.net/108412-fremde-dll-per-com-verwenden-ole-server-proxy-erstellen.html)

Ares 13. Feb 2008 07:27


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:
// *********************************************************************//
// 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;
  ...
Mit der Klasse TKDF konnte ich mir dann einfach ein Objekt erzeugen und so auf die Funktionen der DLL zugreifen. Soweit so gut.

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

Bernhard Geyer 13. Feb 2008 07:41

Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
 
Es gibt da noch einen Schalter das Komponentenwrapper erzeugt werden sollen.

Ares 13. Feb 2008 08:09

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...

Ares 14. Feb 2008 07:34

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:

Die kannst du dir selbst erstellen. Einfach in Delphi 7:
Projekt -> Typbibliothek importieren -> "Meedio Type Library" auswählen.
Dann als Unit-Verzeichnis ein allgemeines Verzeichnis für die TypeLibrary angeben oder den Vorschlag übernehmen.
Haken bei Komponenten-Wrapper generieren rausnehmen und auf "Unit anlegen" klicken.
Ich verwende Delphi 2006 und dort gibt es das Menü "Projekt\Typbibliothek importieren" nicht.

Wenn mir also jemand sagen könnte, wie ich einen Komponentenwrapper erstelle wäre das wirklich klasse!

Besten Dank
Ares

shmia 14. Feb 2008 15:34

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;

taveuni 14. Feb 2008 16:10

Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
 
Zitat:

Du solltest deinen Programcode umstellen anstatt der alten Klasse TKDF nachzutrauern.
Das geht so:
Warum sollte er das?
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. http://support.microsoft.com/kb/245115

War wohl keine Hilfe für das ursprüngliche Problem aber immerhin.
Habe leider "nur" Delphi 7. Und dort findet sich der Schalter.

shmia 14. Feb 2008 16:24

Re: Fremde DLL per COM verwenden - OLE-Server-Proxy erstelle
 
Zitat:

Zitat von taveuni
Zitat:

Du solltest deinen Programcode umstellen anstatt der alten Klasse TKDF nachzutrauern.
Das geht so:
Ich nehme an Du sprichst das Thema early/late binding an.

Nein ich meine den Unterschied zwischen "normalen" COM/DCOM Objekten und OLE-Objekten.
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 15:26 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