Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Excel richtig beenden aus Delphianwendung (https://www.delphipraxis.net/109658-excel-richtig-beenden-aus-delphianwendung.html)

okoeller 5. Mär 2008 16:21


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:
 xxx.Quit
wird zwar die sichtbare Excelanwendung geschlossen, aber im Windows-Task-Manager kann man immer noch sehen das ein Excelprozess (EXCEL.EXE) läuft.
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

Larsi 5. Mär 2008 16:25

Re: Excel richtig beenden aus Delphianwendung
 
Mit KillProcess vielleicht (killt halt wie der Name schon sagt den Process, in dem Fall dann"Excelexe")!

s-off 5. Mär 2008 16:37

Re: Excel richtig beenden aus Delphianwendung
 
Zitat:

Zitat von Larsi
Mit KillProcess vielleicht (killt halt wie der Name schon sagt den Process, in dem Fall dann"Excelexe")!

Und wo gräbst Du etwas wie 'KillProcess' aus?

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;

Kill0r 5. Mär 2008 16:52

Re: Excel richtig beenden aus Delphianwendung
 
Dieses Problem hatte ich auch erst kürzlich ;)
Delphi-Quellcode:
xxx := Unassigned;
Nach der Quit Zeile hat mir geholfen, habe dies mal in einem Codeschnippsel gefunden. :wink:
Viel Spass beim weiterprogrammieren :)

Grüsse aus der Schweiz

okoeller 5. Mär 2008 17:30

Re: Excel richtig beenden aus Delphianwendung
 
Hallo,

Delphi-Quellcode:
 xxx := unassigned;
brachte leider keinen Erfolg.

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

Apollonius 5. Mär 2008 17:40

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.

okoeller 5. Mär 2008 18:22

Re: Excel richtig beenden aus Delphianwendung
 
Zitat:

Ich würde auf jeden Fall von solchen TerminateProcess-Abenteuern abraten. Das behebt nur die Symptome und nicht das zugrunde liegende Problem.
Ok, wie kann ich denn nun rausfinden woran es liegt das Excel sich nicht aus dem Speicher löschen lässt.????

Oliver

Chemiker 5. Mär 2008 19:07

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

okoeller 5. Mär 2008 20:11

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:
procedure TExcelImport.QuitExcel;
begin
  FExcel.DisplayAlerts := False; // exit gracefully, no prompts, etc.
  FExcel.Quit;

  { TODO Excel aus dem Speicher löschen}
end;
Gruß
Oliver

Larsi 5. Mär 2008 20:14

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.
Seite 1 von 2  1 2      

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