Seite 1 von 1

Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Do, 05. Feb 2015 14:10
von georg
Hallo,


ich stehe derzeit vor einem interessanten Problem. In einem Programm öffne ich eine .xlsx-Datei via CreateObject("Excel.Application"), lese ein paar Daten, ändere den Wert einer Zelle, speichere die Datei, schliesse das Workbook, beende Excel, führe ein :destroy() aus, aber Excel bleibt als Prozess aktiv.

Nach 10 Iterationen habe ich 10 Kopien von Excel im Task-Manager gelistet.

Code gefällig?

Code: Alles auswählen

oExcel := CreateObject("Excel.Application")
oBook := oExcel:workbooks:open(cXFile)
oBook:sheets(1):select()
oSheet := oBook:activeSheet()
...
nValue := oSheet:Cells(nCurRow, nCol):value
...
oSheet:Cells(nCurRow, nWriteCol):value := nLastID
...
oBook:saveAs(cXFile)
oBook:close()
oExcel:quit()
oExcel:destroy()
Es bleibt noch anzumerken, dass die Excel-Instanz auch im Speicher bleibt, nachdem das Programm beendet wurde.

Irgendwie verstehe ich das nicht, da ich den gleichen Code-Ablauf an anderer Stelle verwende und dort solche Effekte nicht habe, d.h. Excel verschwindet aus der Tast-Manager Liste.

Wat nu?

Re: Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Do, 05. Feb 2015 16:27
von Wolfgang Ciriack
Mal probiert noch ein oSheet:=nil einzufügen vor dem Schließen ?

Re: Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Do, 05. Feb 2015 17:30
von Koverhage
oder ein Sleep vor dem Destroy

Re: Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Do, 05. Feb 2015 17:46
von DelUser01
Hallo Georg,

es gibt nur EIN Excel-Object.
Wenn man ein neues Object anfordert ohne das bereits existierende sauber abschließt (löscht). bleibt alles erhalten - die Worksheets, Books usw.
Also...
oBook := NIL
oBooks := NIL
oSheet := NIL
oSheets := NIL
oWorkbook := NIL
oWorkbooks := NIL
usw.
Also alle Objekte die Du/man bei der Arbeit erstellt müssen gelöscht werden.
:destroy() hilft da nicht alleine, die Objekte müssen mit NIL gefüllt werden.
Kann man bei MS nachlesen - habe das aber selber noch nicht (annähernd) verstanden

Bin da auch schon seit einigen Wochen dran...

Re: Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Do, 05. Feb 2015 19:23
von brandelh
das habe ich noch nie benötigt :?

Re: Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Do, 05. Feb 2015 21:59
von AUGE_OHR
georg hat geschrieben:Es bleibt noch anzumerken, dass die Excel-Instanz auch im Speicher bleibt, nachdem das Programm beendet wurde.

Irgendwie verstehe ich das nicht, da ich den gleichen Code-Ablauf an anderer Stelle verwende und dort solche Effekte nicht habe, d.h. Excel verschwindet aus der Tast-Manager Liste.
Frage : läuft der Code im Thread ? verwendest du (Xbase++) DLL wo der Code drin steht ?

zu AutomationObject():destroy()
Achtung: :destroy() entfernt die COM/ActiveX Komponente nicht notwendigerweise aus dem Hauptspeicher. Ist die Komponente unter Kontrolle einse Out-of-Process Automation Servers , dann muß oftmals der Server explizit herunter gefahren werden bevor eine COM/ActiveX Komponente entgültig freigegeben wird. Die Microsoft Office Anwendungen gehören zum Beispiel zu dieser Gruppe von COM/ActiveX Komponenten. Nähere Informationen finden sie in der Dokumentation der entsprechenden COM/ActiveX Komponente.
wie Roland schon erwähnte ist es wichtig das alle Objecte vorher geschlossen und auf NIL gesetzt werden wobei man "innen" beim letzten anfängt und sich nach "aussen" bis zum Excel Object vorarbeitet.

wenn der Code in einer Xbase++ DLL steckt dann versuch mal den Teil in die MAIN vom EXE zu schieben. dito wenn es im Thread läuft versuche es mal ohne Thread.

Re: Excel ist nicht plattbar (:destroy() resistent)

Verfasst: Fr, 06. Feb 2015 4:44
von georg
Hallo,


vielen Dank für die ganzen Antworten.

Geholfen hat, zwei iVars von oBook auf NIL zu setzen:

Code: Alles auswählen

      oSheet := NIL
      oBook := NIL
Zu Jimmy's Fragen: Der Code läuft nicht in einer DLL, sehr wohl aber in einem eigenen Thread.