AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

COM Klassen in dll

Ein Thema von bayo · begonnen am 13. Okt 2004 · letzter Beitrag vom 14. Okt 2004
Antwort Antwort
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#1

COM Klassen in dll

  Alt 13. Okt 2004, 13:38
Hallo zusammen..

Ich probiere gerade eine Schnittstelle zu schreiben, die auf COM-Objekten basiert. Dank den Wizards in Delphi ist das auch kein Problem. Sie soll als Test etwa so aussehen:

Delphi-Quellcode:
Unit COMTest_TLB

  IMyCOMObject = interface;
  MyCOMObject = IMyCOMObject;

  IMyCOMObject = interface(IUnknown)
    ['{2A7898B9-637F-4059-8D76-0FA1F87B8732}']
    function JustATest(i1: Integer; i2: Integer): Integer;
  end;

  CoMyCOMObject = class
    class function Create: IMyCOMObject;
    class function CreateRemote(const MachineName: string): IMyCOMObject;
  end;

  .
  .


Unit COMTest

  TMyCOMObject = class(TTypedComObject, IMyCOMObject)
  public
    function JustATest(i1: Integer; i2: Integer): Integer;
  end;

  .
  .
Aus diesem Projekt kriege ich jetzt zwei Dateien: COMTest.dll und COMTest.tlb. Zum Problem:

Wie kann ich diese DLL jetzt in einem anderen Projekt verwenden bzw. wie kann ich in einem anderen Projekt eine Klasse des Typs TMyCOMObject instanzieren. Benötige ich in Delphi auch die .tlb Datei oder ist die nur für c++? Was ist genau mit dieser GUID, muss ich die zwingend registrieren?

Naja, leider finde ansonsten nur sehr wenig Infos zu diesem Thema aber ich hoffe, dass mir jemand von euch weiterhelfen kann!?

Grüsse und vielen Dank.. Dominic
life can only be understood in reverse
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: COM Klassen in dll

  Alt 13. Okt 2004, 14:07
Die .tlb Datei brauchst Du nur für das Delphi-Projekt bzw. wenn Du das ganze auf DCOM erweitern willst. Die .dll Datei musst Du mit dem MS Tool regsvr32.exe (immer im System32 Ordner) installieren und dann kannst Du das COM-Objekt auch schon einsetzen.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: COM Klassen in dll

  Alt 13. Okt 2004, 15:25
Vielen Dank sakura, das mit dem regsvr32.exe hat mir schon weitergeholfen!

du hast geschrieben, dass ich das COM-Objekt dann einsetzen kann! Naja, ist vielleicht eine blöde frage aber.. Wie kann ich dieses COM-Objekt einsetzen? Muss ich die DLL Laden oder kann ich irgendwie über di GUID auf das Interface zugreifen?
life can only be understood in reverse
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: COM Klassen in dll

  Alt 13. Okt 2004, 15:38
Starte ein zweites Projekt - zB eine normale VCL Anwendung, binde die entsprechende _TLB.PAS in die uses Klausel ein und versuche folgendes:
Delphi-Quellcode:
uses
  ..., COMTest_TLB;

procedure Button1Click(Sender: TObject);
var
  MyCOMObject: IMyCOMObject;
begin
  MyCOMObject := CoMyCOMObject.Create;
  ShowMessage(IntToStr(MyCOMObject.JustATest(1, 2)));
end;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: COM Klassen in dll

  Alt 14. Okt 2004, 08:04
das hat wunderbar geklappt Danke schön!

Ist es richtig, dass man nicht darum herum kommt die Interfaces der COM-Klassen in dieser *_TLB-Unit nachzubilden, wenn die DLL z.B. in c++ geschrieben wurde und diese *_TLB-Unit noch nicht existiert? und ich somit die GUID der Interfaces, wie sie in der DLL verwendet werden, wissen muss?
life can only be understood in reverse
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: COM Klassen in dll

  Alt 14. Okt 2004, 08:09
Zitat von bayo:
Ist es richtig, dass man nicht darum herum kommt die Interfaces der COM-Klassen in dieser *_TLB-Unit nachzubilden, wenn die DLL z.B. in c++ geschrieben wurde und diese *_TLB-Unit noch nicht existiert? und ich somit die GUID der Interfaces, wie sie in der DLL verwendet werden, wissen muss?
Ja und nein Mit 90% der existierenden COM Bibliotheken geht es sogar sehr, sehr einfach, wenn man Delphi besitzt Starte ein neues Projekt, dann gehe in das Menü Projekt -> Typenbibliothek importieren (oder ähnlich, ich habe es nur in Englisch). Im folgenden Dialog gehe auf den Button Hinzufügen und wähle Deine DLL aus. Dann wähle das Zielverzeichnis für die *_TLB.PAS Datei aus und sage ihm, er soll die Unit erstellen.

Optional kannst Du ihn auch gleich eine Komponente in die Palette installieren lassen, persönlich rate ich davon ab, das ist aber reine Geschmackssache

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: COM Klassen in dll

  Alt 14. Okt 2004, 08:12
Nachtrag: Den Import von COM-Bibliotheken hat Chakotay anhand der MS XML Komponente in seinem Tutorial ausführlich dargelegt: http://www.delphipraxis.net/internal...ect.php?t=8184

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:39 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