Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi COM Klassen in dll (https://www.delphipraxis.net/31763-com-klassen-dll.html)

bayo 13. Okt 2004 13:38


COM Klassen in dll
 
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

sakura 13. Okt 2004 14:07

Re: COM Klassen in dll
 
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.

...:cat:...

bayo 13. Okt 2004 15:25

Re: COM Klassen in dll
 
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?

sakura 13. Okt 2004 15:38

Re: COM Klassen in dll
 
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;
...:cat:...

bayo 14. Okt 2004 08:04

Re: COM Klassen in dll
 
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?

sakura 14. Okt 2004 08:09

Re: COM Klassen in dll
 
Zitat:

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 ;-)

...:cat:...

sakura 14. Okt 2004 08:12

Re: COM Klassen in dll
 
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

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 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