AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Fremde DLL per COM verwenden - OLE-Server-Proxy erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Fremde DLL per COM verwenden - OLE-Server-Proxy erstellen

Ein Thema von Ares · begonnen am 13. Feb 2008 · letzter Beitrag vom 14. Feb 2008
Antwort Antwort
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Fremde DLL per COM verwenden - OLE-Server-Proxy erstellen

  Alt 13. Feb 2008, 07:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 13. Feb 2008, 07:41
Es gibt da noch einen Schalter das Komponentenwrapper erzeugt werden sollen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#3

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

  Alt 13. Feb 2008, 08:09
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...
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#4

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

  Alt 14. Feb 2008, 07:34
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

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

  Alt 14. Feb 2008, 15:34
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;
Andreas
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 14. Feb 2008, 16:10
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

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

  Alt 14. Feb 2008, 16:24
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.
Andreas
  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 21:08 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