Hallo alle zusammen,
Ich bin wieder auf ein Mysterium der
Com-Programmierung gestoßen.
Ich hab in Delphi eine
DLL geschrieben, in der 5 Threads erstellt werden. Dies sind 5 Workthreads in denen verschiedenen Kommunikationsprotokolle abgearbeitet werden.
Nun gibt es auch eine Wrapper Klasse die unterschiedliche Kommunikationen zuläßt, sprich es gibt eine Basisklasse und dann x Ableitungen, u.a. eine
XML über
TCP/
IP KLasse, eine reine
TCP/
IP Klasse und eben auch eine Klasse um OPC zu betreiben. Die Klasse OPC generiert nun das OPC
COM Objekt und wenn ich die
DLL in einem Delphi Programm einbinde, laufen die Threads und alles drum und dran funktioniert.
Jetzt gibt es aber nicht nur Delphi sondern auch VB, LabView, etc... im aktuellen Problemfall haben wir genau diese beiden.
Die
DLL läßt sich perfekt in LabView wie auch in VB laden und man kann den VersionString ziehen, etc.. auch kann man werte in den OPC Namespace reinschreiben und alles funktioniert tadelos, bis auf folgendes:
Die Threads in der
DLL steuern natürlich auch die "WriteItem" funktion an (so heißt die Funktion in der
DLL um Werte in den Namespace zu schreiben). Wird WriteItem von der Delph, VB oder LabView Applikation aufgerufen, funktioniert es.. wird die
DLL jetzt aber in VB oder in Labview eingebunden und wird die Funktion aber von einem der WorkerThreads in der
DLL aufegrufen.. schwupp.. ist das
COM Objekt nicht mehr sichtbar, sprich es gibt es nicht mehr.
Jeder der einzelnen Threads werden übrigends initialisert mit:
[delphi]
CoInitializeEx(nil, COINIT_MULTITHREADED);
[delphi/]
Das hat mich schonmal 4 Monate gekostet, nach dem das drin war, lief alles. Nur läuft es halt nicht in VB oder in LabView.... das OPC
COM Objekt ist einfach nicht sichtbar.
Kennt jemand das Problem das
COM Objekte in
DLL's nicht mehr für die
DLL selbst sichtbar sind, sondern nur im Context der Hostapplikation da sind.
Grüße
Andi