![]() |
Excel richtig beenden aus Delphianwendung
Hallo,
mit welchem Befehl kann ich einen Excel-Prozess aus dem Speicher/Windows-Task-Manager entfernen? Wir öffnen mit einer Delphianwendung eine Exceldatei und importieren Kundendaten. Mit dem Befehl
Delphi-Quellcode:
wird zwar die sichtbare Excelanwendung geschlossen, aber im Windows-Task-Manager kann man immer noch sehen das ein Excelprozess (EXCEL.EXE) läuft.
xxx.Quit
Der verschwindet erst, wenn ich meine Delphianwendung schliesse. Nun kann es aber sein, dass der User aus mehreren xls-Dateien mehrfach Kunden importiert. Macht er dies 5-mal sind 5 Excel-Prozesse im Speicher. Wie lässt sich dieser Excel-Prozess aus dem Speicher entfernen, so dass er nicht jedesmal die Delphianwendung schliessen und neu starten muss. Für ein paar Hinweise wäre ich sehr dankbar. Oliver |
Re: Excel richtig beenden aus Delphianwendung
Mit KillProcess vielleicht (killt halt wie der Name schon sagt den Process, in dem Fall dann"Excelexe")!
|
Re: Excel richtig beenden aus Delphianwendung
Zitat:
Probier's mal hiermit: (keine Ahnung, woher ich den Code ursprünglich habe)
Delphi-Quellcode:
function TForm1.KillTask(ExeFileName: string): Integer;
const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; |
Re: Excel richtig beenden aus Delphianwendung
Dieses Problem hatte ich auch erst kürzlich ;)
Delphi-Quellcode:
Nach der Quit Zeile hat mir geholfen, habe dies mal in einem Codeschnippsel gefunden. :wink:
xxx := Unassigned;
Viel Spass beim weiterprogrammieren :) Grüsse aus der Schweiz |
Re: Excel richtig beenden aus Delphianwendung
Hallo,
Delphi-Quellcode:
brachte leider keinen Erfolg.
xxx := unassigned;
Für den KillTask fehlen wohl einige Eintragungen in den uses, z.Bsp. kann ich nichts mit " TProcessEntry32 " anfangen. "Refactoring/Unit suchen" hat nichts gefunden. Vielleicht hilft es ja wenn ich mal die Öffnen Prozedur poste.
Delphi-Quellcode:
FExcel: Variant;
Delphi-Quellcode:
procedure TExcelImport.OeffneDatei(Dateiname: string);
begin try FExcel:= CreateOleObject('Excel.Application'); FExcel.Visible := false; FExcel.WorkBooks.Open(Dateiname); FSheet := FExcel.Workbooks[1].WorkSheets[1]; except on E:EOleException do begin FExcel.Quit; raise EFileAccessException.Erzeugen('Die Datei konnte nicht geöffnet werden: ' + E.ClassName); end; end; end; Oliver |
Re: Excel richtig beenden aus Delphianwendung
Ich würde auf jeden Fall von solchen TerminateProcess-Abenteuern abraten. Das behebt nur die Symptome und nicht das zugrunde liegende Problem.
|
Re: Excel richtig beenden aus Delphianwendung
Zitat:
Oliver |
Re: Excel richtig beenden aus Delphianwendung
Hallo okoeller,
wenn kein Fehler auftritt wird Excel auch nicht geschlossen. Geh einfach mit F7 die Procedure durch, dann wirst Du sehen, dass der Teil nach except nicht ausgeführt wird, also wird Excel auch nicht geschlossen. Bis bald Chemiker |
Re: Excel richtig beenden aus Delphianwendung
Hallo Chemiker,
es gibt natürlich noch eine Schliessen-Methode die nach dem Import aufgerufen wird. Aber wie oben beschrieben verbleibt eine Excel-Prozedur im Speicher. Wird der Import erneut aufgerufen sind anschliessend zwei Excel-Prozeduren im Speicher. Die " xxx.Quit " Methode greift leider nicht.
Delphi-Quellcode:
Gruß
procedure TExcelImport.QuitExcel;
begin FExcel.DisplayAlerts := False; // exit gracefully, no prompts, etc. FExcel.Quit; { TODO Excel aus dem Speicher löschen} end; Oliver |
Re: Excel richtig beenden aus Delphianwendung
bei dem killtask musste glaubich tlhelp32 bei den uses einbinden dann gehts bei mir^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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 by Thomas Breitkreuz