Jump to content

COM in C# (Fehlermeldung beim Beenden)


Recommended Posts

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?

 

Link to comment

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 by nuts
Link to comment
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. ;-)

Link to comment

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.

Link to comment

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

Link to comment

 

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.

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...