Jump to content

DVBViewer 3.2.6 COM-Interface


Rayman

Recommended Posts

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 by Rayman
Link to comment

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

Link to comment
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 by Rayman
Link to comment

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.

Link to comment
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

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...