ActiveX Control (.OCX) in Windows Service (Dienst) ohne Window einbinden
-
Hallo Forum!
Ich stehe vor dem Problem ein, bzw. zwei ActiveX Controls in einen Prozess einbinden zu müssen der als Konsolenanwendung aufgebaut ist und später als Dienst ohne aktives Fenster läuft.
Ich hab die OCX'e mit
#import "Typelib\<Filename>.ocx" raw_native_types, named_guidseingebunden, die .TLH und .TLI-Dateien werden generiert und problemlos compiliert, gelinkt etc.
Ich kann auch CoCreateInstance(), QueryInterface() aufrufen ohne Probleme, erst wenn ich Funktionen des ActiveX Controls aufrufen will stürzt das Programm ab.
Die Vorgehensweise ist identisch zu anderen Prozessen in denen COM-Komponenten eingebunden wurden, da geht alles problemlos
Zur Info noch: Die Programmierumgebung ist Microsoft Visual C++ 6.0
Vom Hersteller des ActiveX Controls kam nur die lapidare Antwort: In unserem Beispielprogramm gehts doch....
Das ist allerdings als AFC(??) Anwendung mit Fenstern usw. aufgebaut, und alle Kommentare sind in Japanisch...
Vielen Dank für jeden Tipp!
Armin
-
Was ist das für ein ActiveX STA?
Oder anders gefragt: Welchen Threadmodus unterstützt es.Abstürzen dürfte das ganze nicht weil keine Messageloop existiert...
Zeig mal ein Stück code.Wenn STA verwendet wird, musst Du eine Messageloop haben. Ob Du nun Fenster hast oder nicht spielt mal gar keine Rolle:
http://msdn.microsoft.com/en-us/library/ms680112.aspx
Each single-threaded apartment must have a message loop to handle calls from other processes and apartments within the same process. Single-threaded apartments without objects (client only) also need a message loop to dispatch broadcast sendmessages that some applications use.Siehe auch:
http://www.codeproject.com/KB/COM/CCOMThread.aspx
-
Vielen Dank erstmal für die Antwort!
wie erkenne ich welchen Threadmodus ein Control unterstützt? Sollte das in der Doku stehen oder kann man das irgendwo auslesen?
Messageloop hat der Prozess noch keine, ich bin aber gerade dabei eine einzubauen. Da wird sich dann hoffentlich ein Unterschied zeigen...
Ich melde mich wieder!
Gruss Armin
-
Es geht erstmal primär darum welches Appartment Du aufmachst:
Wie rufst Du CoInitializeEx auf?BTW: Bist Du fähig einen Link auch zu lesen, wenn man ihn Dir gibt?

Wenn ja, warum liest Du nicht die Einführung die auf www.codeproject.com steht?
Hier zum zweiten mal der Link: http://www.codeproject.com/KB/COM/CCOMThread.aspx