Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OleServer: Kein CoClass-Create, kein ConnectTo? (https://www.delphipraxis.net/121158-oleserver-kein-coclass-create-kein-connectto.html)

FoxOne 23. Sep 2008 10:48


OleServer: Kein CoClass-Create, kein ConnectTo?
 
Hallo, Delphi Experten!

Ich bin recht neu auf dem Gebiet von COM bzw. ActiveX und hänge nun mit Verständnisproblemen.
Durch 'Import Type Library' habe ich aus einer dll einen tlb-File mit Wrapper erzeugt und nach Vorschrift des Herstellers einen Client erstellt - passt alles.
Nun habe ich auch selbst einen Automation Object geschrieben, das wie auch die dll Events unterstützt. Dabei habe ich folgenden Unterschied bemerkt.

Bei mir sieht die Server-Initialisierung im Client (z.B. im FormCreate) folgendermaßen aus:


Code:
FEventServer : IEventServer;
LocalEventServer : TEventServer;
procedure OnMyEvent(Sender : TObject);
..
..

  FEventServer:=CoEventServer.create;
  LocalEventServer:=TEventServer.create(nil);
  With LocalEventServer do
  begin
    AutoConnect:= False;
    ConnectTo(FEventServer);  
    LocalEventServer.OnServerEvent:=OnMyEvent;
  end;

Bei der dll reicht folgendes:

Code:
..
..
  ExternServer:=TExternServer.create(self);
  ExternServer.OnEvent1:=MYOnEvent1;
Hier wird also nicht das Create der CoClass aufgerufen, und auch das ConnectTo für die Events fehlt (setzte ich Autoconnect auf false und kommentiere ConnectTo aus, bekomme ich bei jedem Event eine Exception). Kann mir jemand den Unterschied erklären bzw. erläutern, wie ich mein Automation Object so hinbringe, dass es gleich verwendbar ist wie die dll?

sirius 23. Sep 2008 11:26

Re: OleServer: Kein CoClass-Create, kein ConnectTo?
 
Was soll man das jetzt erklären? Das sieht wie zwei verschiedene Sachen aus und die kann man nicht vergleichen.

FoxOne 24. Sep 2008 08:42

Re: OleServer: Kein CoClass-Create, kein ConnectTo?
 
Das hilft mir jetzt nicht viel weiter.

Es ist mir klar, dass es sich um unterschiedliche Dinge handelt. Dieser Unterschied interessiert mich ja. Warum ist kein Vergleich möglich? Eine Antwort darauf könnte auch eine Hilfe sein. Wenn Information fehlt, liefere ich gerne etwas nach.

Wie gesagt, ich habe die tlb von der dll gewonnen. Somit nehme ich an, dass es auch mit Delphi möglich sein wird, in gleicher Weise ein dll zu erzeugen, bei der dann im Client kein CoMyClass.Create aufgerufen werden muss, sondern TMyClass.Create reicht - ist diese Annahme falsch?
Vielleicht kann die CoClasse automatisch kreiert werden?

sirius 24. Sep 2008 14:28

Re: OleServer: Kein CoClass-Create, kein ConnectTo?
 
Mal sehen, ob ich dich richtig verstanden habe...


Also die TLB (mittels Typbibliothek importieren) gibt die verschiedene Möglichkeiten, um auf ein Interface zuzugreifen:
  1. Das Dispinterface (sofern möglich)
  2. das Duale Interface (also ganz normal: type xaz=interface(Ixxxx))
  3. eine kleine coClass zu dem dualen Interface
  4. Eine Klasse, die komplett das duale Interface kapselt
Du kannst also jetzt die Deklarationen von 1. und 2. nutzen und mit der WinAPI-Funktion GetXXXObject dir ein Object erzeugen.
Wenn du nicht über die WinApi gehen willst, dann nimmst du die CoClass. Ansonsten ist alles dasselbe. Du musst nur nicht mehr die CLSID etc. wissen bei der CoClass.
Das 4. ist eine komplette Klasse, die das Interface kapselt. Die benutzt du wie jede andere Klasse auch und brauchst dich dabei mit dem ganzen Rest (Interfaces etc.) aus der TLB nicht zu
beschäftigen.

(Wenn dann noch Automatisierungsobjekte in der Bibliothek sind, gibt es dann noch für die späte Bindung eine weitere Möglichkeit, dafür braucht man aber keine TLB.)

Und jetzt verstehe ich nicht, wann und wo bist du in welcher DLL und in welchem Programm :Gruebel:

FoxOne 25. Sep 2008 13:08

Re: OleServer: Kein CoClass-Create, kein ConnectTo?
 
Danke für die Informationen (ich weiss, es ist für einen Insider sicher eine blöde Frage). Alles verstehe ich leider nicht, aber ich will einmal die genauen Umstände erklären.

Ich erhielt zur Programmierung eines Messystems eine API in Form eines (einer?) dll und eines Manuals. Das System erfordert die Bearbeitung von vielen Events, weil die Bestätigung von Messparameteränderung von mir durch Events erfolgen. Dabei gibt es auch viele Fehlerquellen, die sich physikalisch bzw. hardwaretechnisch nicht so einfach erzeugen lassen, aber für meine Mess-Software sehr wichtig sind. Um das zu testen, dachte ich, ich baue einfach dieses dll nach und setzte dahinter ein simuliertes System. Dadurch kann ich die Fehler selber erzeugen und testen, ob die Mess-Software richtig darauf reagiert.

Alles, was ich bisher von COM, tlb etc. weiss, habe ich mir dafür kürzlich erarbeitet und bin nun in der Lage, mit solchen Dingen wie Enums, IEnumVariants und Events umzugehen. Ich muss aber zugeben, dass es mir in dieser Zeit nicht ganz gelungen ist, das 'Gesamtbild' zu verstehen.
Zum Beispiel kann ich mir den genannten Unterschied beim Create nicht erklären. Die CoClass-Deklaration findet sich durchaus in der tlb:

Delphi-Quellcode:
CoDatServer = class
    class function Create: IDatServer;
    class function CreateRemote(const MachineName: string): IDatServer;
end;
Aber in meinem Messprogramm muss ich das nicht aufgerufen (dort wie erwähnt reicht DatServ:=TDatServer.create), sehr wohl aber in meinem Nachbau.

Und wie das kommt, hätte ich gerne gewusst.


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