Programm hinterlässt Prozess, obwohl beendet



  • Hallo,

    für alle, die es vielleicht interessiert. Ich habe jetzt eine Variante gefunden, bei welcher das Durchsuchen einer Exceldatei in einem eigenen Thread funktioniert.

    Das Excel-Objekt wird im Thread initialisiert.

    void __fastcall XLSSearch::Execute()
    {
      OleCheck(CoInitialize(NULL));
    
      try
      {
        FExcel = new TMLExcel;
        FExcel->OpenWorkbook(MainForm->datapath+FileName);
        FExcel->CloseExcelOnTerminate = true;
        FExcel->Books[0]->Saved = true;  // damit beim Schließen von Excel kein Speichern-Dialog eingeblendet wird
    
        try
        {
          ExcelSuche([Parameter]); // hier werden auch Parameter übergeben
        }
        catch(Exception &e)
        {
          msg = "Fehler beim Start der ExcelSuche():";
          Synchronize(WriteMsg);   //Eintrag in eine log-Datei
          msg = e.Message;
          Synchronize(WriteMsg);   //Eintrag in eine log-Datei
        }
      }
      __finally
      {
        delete FExcel;
        FExcel = NULL;
        CoUninitialize;
      }
    }
    //---------------------------------------------------------------------------
    

    Die Funktion, die dem OnTerminate des Threads zugewiesen ist:

    void __fastcall XLSSearch::DeleteThread(TObject *Sender)
    {
      delete FExcel;
      FExcel = NULL;
      CoUninitialize;
      Flog->Add("Thread beendet.");
    }
    //---------------------------------------------------------------------------
    

    Sooft ich getestet habe, wurde Excel ordnungsgemäß geschlossen und auch der Prozess jedesmal beendet.


Anmelden zum Antworten