dgdg Posted April 19, 2013 Share Posted April 19, 2013 Ich versuche mich mal wieder am COM-Interface, diesmal in C# (Visual Studio 2012) und habe da mangels Erfahrung wieder ein Problem. Ich öffne das COM-Interface folgendemaßen: private void Form1_Load(object sender, EventArgs e) { try { dvbServer = (DVBViewer)System.Runtime.InteropServices.Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); } catch (Exception) { dvbServer = new DVBViewerServer.DVBViewer(); } } Das klappt auch ganz prima, wenn der DVBViewer schon läuft. Ich kann mein Programm starten und beenden und alles funktioniert. Wenn der DVBViewer noch nicht läuft, wird er gestartet und ich kann kommunizieren. Aber wenn ich dann mein Programm beende, bekomme ich ein Fenster mit der Meldung: Ein Aufruf einer Betriebssystemfunktion ist fehlgeschlagen Iim Titel des Fensters steht "Dvbvie~1". Die Fehlermeldung kommt offensichtlich vom DVBViewer. Wenn ich in dem Fenster "Ok" klicke, wird der DVBViewer beendet. Eigentlich möchte ich, dass der DVBViewer einfach weiterläuft, wenn ich mein Programm beende. Auch wenn er durch das Öffnen der COM-Verbindung gestartet wurde. Kann mir jemand sagen, wie ich das hinbekomme? Quote Link to comment
dgdg Posted April 19, 2013 Author Share Posted April 19, 2013 Habe gerade was gefunden: http://www.DVBViewer.tv/forum/topic/45480-DVBViewer-sturzt-bei-einsatz-von-com-ab-ein-aufruf-einer-betriebssystemfunktion-ist-fehlgeschlagen/ Liegt es gar nicht an meinem Programm sondern daran, dass der DVBViewer das nicht kann? Quote Link to comment
nuts Posted April 19, 2013 Share Posted April 19, 2013 (edited) Genau. Du musst wie von Lars beschrieben vorgehen und den DVBViewer nicht durch "CreateObject" starten: { dvbServer = new DVBViewerServer.DVBViewer(); } Das hier durch "run(%\DVBViewer.exe)" ersetzen und dann nochmal zum aktiven Objekt verbinden. Edited April 19, 2013 by nuts Quote Link to comment
dgdg Posted April 19, 2013 Author Share Posted April 19, 2013 Das hier durch "run(%\DVBViewer.exe)" ersetzen und dann nochmal zum aktiven Objekt verbinden. Ja, genau so habe ich das jetzt gemacht. Wo ist das denn beschrieben? Vermutlich irgendwo in den Delphi-Docs. Die habe ich natürlich nicht angeschaut. ;-) Quote Link to comment
dbraner Posted April 20, 2013 Share Posted April 20, 2013 Ja, genau so habe ich das jetzt gemacht. Wo ist das denn beschrieben? Vermutlich irgendwo in den Delphi-Docs. Die habe ich natürlich nicht angeschaut. ;-) Welche Docs? Es gibt die Helpfiles für das COM Interface zum Download. Da sind aber nur die Funktionen erklärt. Die meiste "Doku" findest Du hier in diesem Unterforum. Für C++ und C# sowieso. Alles andere muss man sich per Trial and Error selbst zusammen reimen. Quote Link to comment
JMS Posted April 20, 2013 Share Posted April 20, 2013 Ich versuche mich mal wieder am COM-Interface, diesmal in C# (Visual Studio 2012) und habe da mangels Erfahrung wieder ein Problem. Ich öffne das COM-Interface folgendemaßen: private void Form1_Load(object sender, EventArgs e) { try { dvbServer = (DVBViewer)System.Runtime.InteropServices.Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); } catch (Exception) { dvbServer = new DVBViewerServer.DVBViewer(); } } Das klappt auch ganz prima, wenn der DVBViewer schon läuft. Ich kann mein Programm starten und beenden und alles funktioniert. Wenn der DVBViewer noch nicht läuft, wird er gestartet und ich kann kommunizieren. Aber wenn ich dann mein Programm beende, bekomme ich ein Fenster mit der Meldung: Ein Aufruf einer Betriebssystemfunktion ist fehlgeschlagen Iim Titel des Fensters steht "Dvbvie~1". Die Fehlermeldung kommt offensichtlich vom DVBViewer. Wenn ich in dem Fenster "Ok" klicke, wird der DVBViewer beendet. Eigentlich möchte ich, dass der DVBViewer einfach weiterläuft, wenn ich mein Programm beende. Auch wenn er durch das Öffnen der COM-Verbindung gestartet wurde. Kann mir jemand sagen, wie ich das hinbekomme? Hast Du eine saubere Freigabe der COM Referenz drin (e.g. im Dispose der Form): if (dbServer != null) if (Marshal.IsComObject(dbServer)) Marshal.ReleaseComObject(dvbServer); Manchmal erfolgt diese Freigabe einfach zum falschen Zeitpunkt. Beim Beenden hatte ich das Problem allerdings noch nie, aber einen Versuch wert ist es allemal. Jochen Quote Link to comment
nuts Posted April 20, 2013 Share Posted April 20, 2013 Ja, genau so habe ich das jetzt gemacht. Wo ist das denn beschrieben? Vermutlich irgendwo in den Delphi-Docs. Die habe ich natürlich nicht angeschaut. ;-) Das steht in der COM Doku: This is the documentation for the DVBViewer COM server and related parts. The version 1.3 of this document is intended for DVBViewer 3.2.5+. The DVBViewer registers itself in the ROT when running. You normaly do a getactiveobject to connect to it. 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.