Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

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: 1934
Registriert: Fr, 08. Feb 2008 21:29

Excel ist nicht plattbar (:destroy() resistent)

Beitrag von georg » Do, 05. Feb 2015 14:10

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

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2288
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Wolfgang Ciriack » Do, 05. Feb 2015 16:27

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: 1963
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

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

Beitrag von Koverhage » Do, 05. Feb 2015 17:30

oder ein Sleep vor dem Destroy
Gruß
Klaus

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

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

Beitrag von Roland Gentner » Do, 05. Feb 2015 17:46

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...
Gruß
Roland

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 05. Feb 2015 19:23

das habe ich noch nie benötigt :?
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Do, 05. Feb 2015 21:59

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: 1934
Registriert: Fr, 08. Feb 2008 21:29

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

Beitrag von georg » Fr, 06. Feb 2015 4:44

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

Antworten