Rayman Posted January 6, 2006 Share Posted January 6, 2006 (edited) Hallo (c++) COM-Gemeinde :-) ich programmiere zur Zeit ein kleines Tool in C++ für den DVBViewer. Mit Version 3.2.5 funktioniert alles einwandfrei! Seit DVBViewer Version 3.2.6.80 habe ich Probleme beim Zugriff auf das Interface IDVBViewer. So sieht der Zugriff aus: HRESULT hr = CoCreateInstance(CLSID_DVBViewer, NULL, CLSCTX_SERVER, IID_IDVBViewer, reinterpret_cast<void**>(&pDVB)); if (!SUCCEEDED(hr)) { printf("Fehler! (HResult = %x)\n", hr); CoUninitialize(); return 0; } pDVB->get_ChannelManager(&chanMgr); ... Wenn der DVBViewer 3.2.6 ausgeführt wird und ich starte das Tool, dauert der CoCreateInstance Aufruf ca. 30 Sek. und schlägt dann mit dem Result 'Server execution failed (0x80080005)' fehl. Gleichzeitig erhalte ich in der Windows-Ereignisanzeige den Fehler 10010: 'Der Server "{D0B1ACAD-1190-4E6D-BD60-41DFA6A28E30}" konnte innerhalb des angegebenen Zeitabschnitts mit DCOM nicht registriert werden.' Google danach befragt liefert dolle Geschichten ;-) Wenn ich auf DVBViewer 3.2.5 "umschalte", läuft mein executable problemlos. Kann dieses Verhalten jemand (mit C++ Umgebung) bestätigen? Was wurde denn an dem COM-Interface in 3.2.6 verändert?? Viele Grüße, Stefan. Edited January 6, 2006 by Rayman Quote Link to comment
JMS Posted January 6, 2006 Share Posted January 6, 2006 Soweit ich mich erinnere startet CoCreateInstance eine EXE (nicht DLL, nicht Service) mit dem Befehlszeilenparameter /Embedding. Vielleicht kommt die Version damit nicht klar? Denn: 30 Sekunden bis zum Fehler heisst vermultich, dass die EXE hochkommt, sich aber nicht COM registriert. Kann man innerhalb der 30 Sekunden ja mal mit dem ProcessExplorer vom SysInternals kontrollieren! Jochen Quote Link to comment
Rayman Posted January 6, 2006 Author Share Posted January 6, 2006 (edited) Soweit ich mich erinnere startet CoCreateInstance eine EXE (nicht DLL, nicht Service) mit dem Befehlszeilenparameter /Embedding. Ist das nicht unabhängig von EXE, DLL oder Service? - Zumindest gibt man als Parameter an wie der Prozess im Programm eingebunden ist (LOCAL_SERVER, INPROC_SERVER etc.). Denn: 30 Sekunden bis zum Fehler heisst vermultich, dass die EXE hochkommt, sich aber nicht COM registriert. Hier wirds interessant! Der DVBViewer.exe ist ja bereits gestartet und läuft bevor das Tool ausgeführt wird! Wenn der DVBViewer nicht gestartet ist und man startet das Tool, startet der DVBViewer, die Instanz wird korrekt erzeugt und der DVBViewer schließt sich bei Beenden des Tools selbst wieder. Stefan. Edited January 6, 2006 by Rayman Quote Link to comment
Rayman Posted January 8, 2006 Author Share Posted January 8, 2006 Für alle die Interesse am Thema haben, ich habe das Problem in C++ gelöst. Wenn der DVBViewer läuft, holt man sich das Interface mit: [...] HRESULT hr = GetActiveObject(CLSID_DVBViewer, NULL, (IUnknown**) (&pUnk)); [...] hr = pUnk->QueryInterface(IID_IDVBViewer, (void**) (&pDVB)); anstatt eines mit 'CoCreateInstance' zu erzeugen. RTFM ;-) Das es in Version 3.2.5 funktioniert hat, war Zufall bzw. wurde in 3.2.6 gefixt. Ansonsten ist das COM-Handling in C++ angenehmer zu programmieren, als ich gedacht hatte. Viele Grüße, Stefan. Quote Link to comment
JMS Posted January 8, 2006 Share Posted January 8, 2006 Ansonsten ist das COM-Handling in C++ angenehmer zu programmieren, als ich gedacht hatte. Falls Du Microsoft Visual C++ verwendest und #import noch nicht kennst, solltest Du Dir die Dokumentation dazu anschauen. Je nach Situation (e.g. wenn DVBViewer eine Type Library anbietet) wird es damit noch einfacher. Jochen Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.