![]() |
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:
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?
..
.. ExternServer:=TExternServer.create(self); ExternServer.OnEvent1:=MYOnEvent1; |
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.
|
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? |
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:
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: |
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:
Aber in meinem Messprogramm muss ich das nicht aufgerufen (dort wie erwähnt reicht DatServ:=TDatServer.create), sehr wohl aber in meinem Nachbau.
CoDatServer = class
class function Create: IDatServer; class function CreateRemote(const MachineName: string): IDatServer; end; Und wie das kommt, hätte ich gerne gewusst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz