Announcement

Collapse
No announcement yet.

Beenden eines Excel Prozesses

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Beenden eines Excel Prozesses

    Umgebung Visual Studio .Net 2003
    Excel 97
    Aus einem Fenster einer MDI-Anwendung heraus sollen Daten in ein Excel Datei geschrieben werden, was auch keine ohne Probleme läuft.
    Abschließend möchte ich jedoch Excel beenden.
    die erste Instanz verhart jedoch als Prozess im Taskmanager sichtbar ) bis die komplette Anwendung geschloßen wird . Öffnet man nun während die Anwendung noch offen ist eine Excel Datei so ergibt sich das Problem, daß genau dieser Prozess genutz wird, welcher zuvor geschloßen wurde. Excel öffnet sich zwar aber die Sicht auf den Arbeitsbereich wird nicht angezeigt.

    Wenn ich nochmehr dateien aus meinem Programm abspeichere, wird zwar erneut eine Excel Instanz (als Prozess im Taskmanager sichtbar) geöffnet, diese wird nach dem Abspeichern aber auch wieder geschloßen.

    Mit folgendem Code öffne ich Excel:

    <PRE>
    if (this.excel==null)
    {
    this.excel= new Excel.Application();
    }
    this.excel.Visible=false;
    this.excel.Interactive=true;
    </PRE>

    Mit folgendem Code beende ich Excel:

    <PRE>
    this.excel.Visible=true;
    this.excel.UserControl=true;
    this.excel.Quit();
    //folgendes wurde auch schon Probiert blieb ebenfalls ohne Wirkung
    //this.excel.DDETerminate(this.excel.DDEAppReturnCod e);
    </PRE>

    Mfg
    Jörg

  • #2
    Hallo,

    die Interface-Zeiger auf die verschiedenen Excel-Objekte müssen mit <b>Marshal.ReleaseComObject</b> (Namespace <i>System.Runtime.InteropServices</i>) freigegeben werden, damit die COM-Objekte der Excel-Instanz abgeräumt werden können (der letzte Interface-Zeiger bestimmt die Lebensdauer). Das folgend VB.NET-Beispiel zeigt dies:
    <pre>
    ...
    ' Automation-Instanz von Excel schließen
    XlBook.Close(SaveChanges:=False)
    XlApp.Quit()
    ' Verweise auf die Interface-Zeiger freigegeben
    Marshal.ReleaseComObject(ApplicationObject)
    Marshal.ReleaseComObject(XlSheet)
    Marshal.ReleaseComObject(XlBook)
    Marshal.ReleaseComObject(XlWorkBooks)
    Marshal.ReleaseComObject(XlApp)
    </pre&gt

    Comment


    • #3
      Hallo,

      Danke für die Antwort.

      Habe folgenden Code nun Eingefügt:
      <PRE>
      Marshal.ReleaseComObject(this.oesSheetxls) ;// sheet
      Marshal.ReleaseComObject(this.obook) ;// workbook
      Marshal.ReleaseComObject(this.obooks) ;// workbooks
      Marshal.ReleaseComObject(this.excel) ;// Excel.ApplicationClass
      </PRE>

      Bisher hat sich noch nichts verändert.
      Vermutlich liegt es daran das ich mir nicht sicher bin was mit :
      <PRE>
      Marshal.ReleaseComObject(ApplicationObject)
      </PRE>
      gemeint ist.
      Muß ich noch auf ein DTE Objektverwenden um eine reibungslose Funktionalität hinzubekommen?
      Mfg.
      Jör

      Comment


      • #4
        Hi<P>
        Wenn man nach dem aufräumen mit Marshal.ReleaseComObject noch GC.Collect aufruft beendet sich die Excel instanz.<P>
        Ich denke, dass die excel instanz beendet wird, sobald die Garbage Collection im Gange ist. Mit GC.Collect kann man dies forcieren.
        <P>
        Gruss Simo

        Comment


        • #5
          Hi nochmals<P>
          Ich habe bemerkt, dass es auch ohne Marshal.ReleaseComObject geht, nur mit GC.Collect.<P>
          Bin mir nicht sicher, ob das wirklich die feine Art ist.<P>
          Gruss Simo

          Comment


          • #6
            Hallo,

            genau das hatte ich mir auch gedacht, funktioniert auch bei jeder weiteren Instanz,
            die erste Excel Instanz verweilt jedoch als Process weiter im Speicher und nimmt sich Excel Dateien an sobald man versucht diese direkt per MausKlick zu öffnen, mit oben beschriebenem Resultat!

            habe hinter GC.Collect sogar noch ein GC.WaitForPendingFinalizers() gehängt um sicher zustellen das alles auf geräumt ist aber das Programm verweilt solange im Speicher bis die gesammte Applikation geschlossen wird, ausser man schießt Sie im Task Manager ab.

            Mfg.

            Jör

            Comment


            • #7
              Hi<P>
              Ich habe noch den zugehörigen KB Artikel gefunden:<P>
              http://support.microsoft.com/default.aspx?scid=KB;EN-US;q317109&
              <P>
              Gruss Simo

              Comment


              • #8
                Hallo,

                danke!

                Mein Problem lag darin, das ich in einer Schleife durch die workbooks durchlaufen bin. diese jedoch nicht wieder freigegeben habe.
                Seit derUmstellung funktionierts!

                Gruß Jör

                Comment

                Working...
                X