Excel ist nicht plattbar (:destroy() resistent)

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Excel ist nicht plattbar (:destroy() resistent)

Beitrag 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?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

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

Beitrag von Wolfgang Ciriack »

Mal probiert noch ein oSheet:=nil einzufügen vor dem Schließen ?
Viele Grüße
Wolfgang
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag von Koverhage »

oder ein Sleep vor dem Destroy
Gruß
Klaus
DelUser01

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

Beitrag 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...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

das habe ich noch nie benötigt :?
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

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

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten