Feedback zu „Mit VB6 Event aus unabhaenigem Process enpfangen“
Am 17. Juli 2001 um 19:52 Uhr schrieb ich eine eMail an 10 Experten. Diese eMail fing mit folgedem Satz an: „wie empfange ich bitte ein Event, das ich aus einem mit CreateObject erzeuten unabhänigem Process absende.“
Darauf erhielt ich Anworten von:
Balázs Bárány Danke für den entscheidende Tip - kurz und wirkungvoll!
Dirk Edgar Pohle Toller Beispiel-Code (siehe unten 1111111111…)
jpk Beschrieb deutlich die erforderlich Referenz auf dem Event-Server (siehe unten 2222222222…) (Was bitte ist an „binärer Kompatibilität“ so wichtig?)
Markus Heckelmann schickte eine umfassende Beschreibung einschliesslich Hintergrund-Infos (siehe unten 3333333333…) Zusätzlich schickte er ein VB-Script. Das wurde aber von www.wer-weiss-was.de vermutlich als Virenschutz) nicht weitergeleitet.
Sculpture Trug die betreffenden Stellen aus dem Hilfe-Text zusammen
Ralph Machte mich darauf aufmerksam, dass ich vergessen hatte zu schreiben, dass ich die Prof.-Ausgabe von VB6 benutze.
Selbstverständlich motivierte mich auch sehr die grosse Anzahl von schnellen Antworten und deren hohe Qualität. Inzwischen läuft mein Programm. Mit ihm wird eine Maschine für einen der Produktionsschritte von TFT-Displays in Betrieb genommen werden.
Allen Experten möchte ich hiermit sehr Danken! Sie erhalten alle diese öffentliche eMail auch privat.
Mit VB-freudigen Grüssen
Martin L. Völker
Informatiker
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Hallo,
ich habe folgendes gemacht – und bei mir funktionierts:
-
Neues Projekt aufmachen, ACTIVEX-Exe
-
Folgenden Code einfügen:
Option Explicit
Event MyEvent()
Public Sub GiveEvent()
RaiseEvent MyEvent
End Sub
-
als Active-X-Exe umwandeln (Name bei mir DEP (Abkürzung von Dirk Edgar Pohle
), Klasse darin class1
-
neues Standard-Projekt aufmachen, Command-Button auf Form klatschen und folgenden Code:
Option Explicit
Private WithEvents x As DEP.Class1
Private Sub Command1_Click()
Set x = New DEP.Class1
x.GiveEvent
End Sub
Sub x_Myevent()
MsgBox („hallo“)
End Sub
- Standard-Projekt starten und es funktioniert.
Grüße, Dirk
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
My Martin,
Events von einem Objekt kann man unter VB nur dann empfangen, wenn es vorher
‚eingebunden‘ wurde (pre-bindung). Deine Version funktioniert einerseits
wegen der unzulässigen Deklaration nicht, andererseits ist eine
Instanzierung mit createobject late-binding, d.h. es gibt dann keine
‚Ereignis-Senken‘, um das Event zu empfangen.
Über die Windows-Message-Queue wurde ich nicht gehen, viel zu aufwendig!
Daher mußt Du folgendermaßen vorgehen:
- Server-Projekt kompilieren (bitte dann auf binäre Kompatibilität achten !)
- Im Client Projekt über [projekt][verweise] den Dialog ‚Verweise‘ öffnen, dort das Projekt MyServer suchen und anklicken.
- Im Client Projekt z.B. über Objektkatalog (kann dann) der Server inkl, seiner Klassen und Ereignisse gesehen werden
Dann kann man dieses Server-Objekt ganz einfach verwenden, wie ein Control auch.
ich hoffe, das kann helfen. Wenn nicht, schicke ich mal ein Beispiel, wie ich das meinte, vorbei.
Ciao
jpk
333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
Hallo Martin,
Das ist überhaupt kein Problem.
Zunächst mal zur Info.
ActiveX basiert auf COM (Component Object Model).
Die Programmierung nach diesem Model basiert auf Schnittstellen und
Schnittstellen-Vererbung
Es gibt eine grundlegende Schnittstelle IUnknown. Von ihr werden alle
anderen Schnittstellen abgeleitet, d.h. jedes COM-Objekt muß diese Schnittstelle
implementieren. In VB muß du dich nicht um diese Schnittstelle kümmern denn sie
wird automatisch implementiert. Außerdem gibt es noch eine weitere
Grundlegende Schnittstelle: IDispatch. Sie ist direkt von IUnknown abgeleitet und
implementiert Zugriffsverfahren für Scripting-Clients und die sogenannte späte
Bindung (in VB „As Object“-Referenz). Außerdem besitzt jedes in VB erstellte
Objekt eine Standardschnittstelle. In ihr sind alle öffentlichen Methoden und
Eigenschaften eines VB-Objekts enthalten. Mit dem Schlüsselwort Implements
kann ein VB-Objekt weitere Schnittstellen implementieren.
Eine Objektvariable stellt genaugenommen nur einen Verweis auf eine einzelne
Schnittstelle eines Objekts dar:
Private refIDispatch as Object
Referenz auf die IDispatch-Schnittstelle.
Private refStandard as MyClass
Referenz auf die Schnittstelle MyClass (könnte z.B. die
Standardschnittstelle eines Objekst aus deiner ActiveX-EXE sein). Damit ein Client diese
Schnittstelle verwenden kann muß er sie natürlich kennen.
So jetzt kommen wir zu den Ereignissen.
Ereignisse werden unter COM folgendermaßen erzeugt: Alle mit Event in einem
Klassenmodul deklarierten Ereignisse bilden zusammen die sog.
Standardereignisschnittstelle. Im Unterschied zu allen bisher genannten Schnittstellen, wird
diese nicht von der Komponente implementiert, sondern von dieser nur
definiert und vom Client der Komponente implementiert. Dazu muß der Client die
Definition dieser Schnittstelle natürlich kennen.
Jetzt kommenwir zum eigentlichen: Woher kennt ein Client die
Schnittstellen-Definitionen. Aus der Typbibliothek. Zum einen gibt es selbständige
Typbibliotehken *.TLB oder *.OLB zum anderen enthält jede *.DLL eine Typbibliothek.
Über das Menü Projekt->Verweise bindet man in VB diese Typbibliotheken ein.
Anschließend kann man eine Objekt-Variable für die entsprechenden
Schnittstellen deklarieren und verwenden.
Wie erstellt man nun eine Typbibliothek für ein ActiveX-EXE? Ganz einfach,
im Dialogfeld Projekteigenschaften kann man bei ActiveX-DLL und -EXE-Projekten
das Kontrollkästchen Remote-Server-Dateien anwählen. Beim nächsten Erstellen
der Komponente wird eine .TLB-Datei erzeugt.
Diese kann dann in die Client-Applikation eingebunden werden.
Dann kann man folgende Code einem Klassenmodul oder Formularmodul, was ja
eigentlich auch ein Klassenmodul ist, schreiben:
Private WithEvents MyActiveXexe As MyServer.MyClass
Sub Main
…
Set MyActiveXexe = CreateObject(„MyServer.MayClass“)
Call MyActiveXexe.MyPubSub()
…
End Sub
Private Sub MyActiveXexe_MyEvent()
…
End Sub
Der Rest wie gehabt.
Es könnte sogar sein, daß die Zeile mit dem Set-Befehl auch folgendermaßen
heißen könnte (bei DLL’s geht es auf jeden Fall):
Set MyActiveXexe = New MyServer.MyClass
Nur bei Verwendung der benutzerdefinierten Schnittstellen, also nicht
IUnknown oder IDispatch wird die Typbibliothek gelesen und dementsprechend kann VB
wissen, welches die Standard-Schnittstelle und welches die
Standard-Ereigniss-Schnittstelle ist, und wie diese zu implementieren sind.
Ich hoffe es hat dir geholfen
Geb mir doch bitte ein Feedback
Mit sonnigen Grüßen
Markus Heckelmann