Excel ist nicht plattbar (:destroy() resistent)

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Excel ist nicht plattbar (:destroy() resistent)

Beitragvon 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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1780
Registriert: Fr, 08. Feb 2008 21:29

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

Beitragvon 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
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2227
Registriert: Sa, 24. Sep 2005 8:37
Wohnort: Berlin

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

Beitragvon Koverhage » Do, 05. Feb 2015 17:30

oder ein Sleep vor dem Destroy
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1893
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen

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

Beitragvon 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
Roland Gentner
1000 working lines a day
1000 working lines a day
 
Beiträge: 655
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim

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

Beitragvon brandelh » Do, 05. Feb 2015 19:23

das habe ich noch nie benötigt :?
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13328
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10210
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitragvon 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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1780
Registriert: Fr, 08. Feb 2008 21:29


Zurück zu MS Office

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast