![]() |
OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Hallo zusammen,
ich verwende Delphi 2007 mit Excel 2007 und versuche eine Verbindung zu Excel wieder zu schließen sodass der Excel.exe Prozess korrekt beendet wird. Ich habe auch schon sehr viel danach gesucht (Google und hier), ein ExcelObj.Workbook.Close bringt keine Verbesserung, die einzigste vorhandene OleVariant Variable wird danach auch auf unassigned gesetzt, trotzdem bleibt der Prozess oben. Was daran das seltsame ist: wenn das .Quit sowie das setzen auf unassigned in der gleichen Prozedur wie das CreateOleObject enthalten ist funktioniert es nicht, wenn es in einer anderen Prozedur enthalten ist wird der Excel.exe Prozess korrekt beendet! Könnt ihr mir erklären warum das so ist oder wie ich es innerhalb _einer_ Prozedur hinbekomme? Habe mal den relevanten Code in ein neues Beispielprojekt gepakt:
Code:
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComObj, StdCtrls; type TForm1 = class(TForm) btnCreate: TButton; btnQuit: TButton; procedure btnCreateClick(Sender: TObject); procedure btnQuitClick(Sender: TObject); private { Private-Deklarationen } ExcelObj: OleVariant; procedure close_excel; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnCreateClick(Sender: TObject); begin try try ExcelObj:=CreateOleObject('Excel.Application'); ExcelObj.Visible:= false; ExcelObj.DisplayAlerts:=false; except on e: exception do begin ShowMessage(e.Message+#13#10+ 'Kein Excel installiert?'); exit; end; end; finally //close_excel; //geht hier nicht, daher raus end; //close_excel; //hier auch nicht, daher raus ShowMessage('pause'); end; procedure TForm1.btnQuitClick(Sender: TObject); begin close_excel; //hier funktioniert es, direkt und ohne die das ShowMessage bestätigen zu müssen ShowMessage('pause'); end; procedure TForm1.close_excel; begin if (not VarIsEmpty(ExcelObj)) then begin ExcelObj.quit; ExcelObj := unassigned; end; end; end. |
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Ich hab es gerade mal getesten, bei mir wird der Prozess korrekt beendet.
Delphi-Quellcode:
Läuft er denn zu diesem Zeitpunkt bei dir in den Quit und Unassigned rein?
procedure TForm4.Button1Click(Sender: TObject);
begin try try ExcelObj := CreateOleObject('Excel.Application'); ExcelObj.Visible := false; ExcelObj.DisplayAlerts :=false; except on e: exception do begin ShowMessage(e.Message + #13#10 + 'Kein Excel installiert?'); exit; end; end; finally close_excel; //Klappt end; close_excel; //Klappt end; |
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
ja er läuft da bei mir ganz sicher rein, ich bin da mitm Debugger schon 100mal durchgelaufen, aber der Excel Prozess bleibt halt oben.
|
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Setze mal das
![]()
Delphi-Quellcode:
ExcelObj:=CreateOleObject('Excel.Application');
ExcelObj.Visible:= false; ExcelObj.DisplayAlerts:=false; ExcelObj.UserControl := False; |
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
hat leider keine Verbesserung gebracht. Nochmal um das klarzustellen (war gestern leider sehr spät geworden, und war heute als ich den Thread eröffnet hatte nicht Zuhause sodass ich es nicht nochmal testen konnte):
Zitat:
@Pitschki1801: was passiert wenn du die
Delphi-Quellcode:
als letzten Schritt vor dem letzten "end;" einfügst, wird dann der Excel Prozess vor oder nach dem Klick auf "ok" beendet?
ShowMessage('pause');
|
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
ein Workaround ist folgendes: eine neue Prozedur erstellen in der alles gemacht wird was voher in btnCreateClick gemacht wurde, diese dann bei btnCreateClick aufrufen
Delphi-Quellcode:
procedure TForm1.create_close;
begin try try ExcelObj:=CreateOleObject('Excel.Application'); ExcelObj.Visible:= false; ExcelObj.DisplayAlerts:=false; ExcelObj.UserControl := false; except on e: exception do begin ShowMessage(e.Message+#13#10+ 'Kein Excel installiert?'); exit; end; end; finally close_excel; end; //close_excel; end; procedure TForm1.btnCreateClick(Sender: TObject); begin create_close; ShowMessage('pause'); //Excel wird nun schon vor dem Klick auf "OK" korrekt beendet end; wieso das funktioniert kann ich mir aber noch nicht erklären, habt ihr eine Idee? |
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Zitat:
|
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Bei mir wurde der Prozess nach dem Ok click beendet.
Mir scheint die Erklärung von ASM ebenfalls recht plausibel zu sein. Wird der Prozess vllt erst mit dem schließen des Programmes freigegeben, wenn du keine Showmessage hast? |
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Ich hab jetzt nochmal bisschen getestet und kann die Aussage von ASM bestätigen.
Würdest du zum Beispiel den CreateOleObject drei mal, in einer Procedure, aufrufen hättest du auch drei Prozesse bis die Procedure beendet ist, auch wenn du die Objecte bereits unassigned hast. Daher macht es Sinn, was du ja bereits getan hast, eine Create-Procedure für das Excel zu definieren. Je nachdem was du mit dem Excel-Object noch vor hast, würde ich die Excel-Thematik in eine eigene Unit verschieben und eine Art Handler schaffen. |
AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
habe nun alle Excel-bezogenen Operationen in eigene Prozeduren gepackt und rufe in meiner Hauptprozedur diese dann nur noch auf, also so
CreateExcel OpenWorkbook SetExcelValues CloseAndFreeExcel wenn egal welchen Inhalt der in einer der o.g. Prozeduren enthalten ist nicht über den Umweg einer Prozedur sondern direkt in der Hauptprozedur verwende wird Excel.exe nicht mehr korrekt beendet. Aber mit diesem "Workaround" funktionert es ganz gut. Danke an alle! Ich hoffe dass User welche das gleiche Problem haben durch diesen Thread auch zu einer Lösung finden. Gruß owow |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz