AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen
Thema durchsuchen
Ansicht
Themen-Optionen

OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

Ein Thema von owow · begonnen am 6. Mär 2012 · letzter Beitrag vom 7. Mär 2012
Antwort Antwort
owow

Registriert seit: 6. Mär 2012
5 Beiträge
 
#1

OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 10:33
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.
  Mit Zitat antworten Zitat
Pitschki1801

Registriert seit: 9. Feb 2012
14 Beiträge
 
Delphi XE Professional
 
#2

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 11:13
Ich hab es gerade mal getesten, bei mir wird der Prozess korrekt beendet.

Delphi-Quellcode:
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;
Läuft er denn zu diesem Zeitpunkt bei dir in den Quit und Unassigned rein?
  Mit Zitat antworten Zitat
owow

Registriert seit: 6. Mär 2012
5 Beiträge
 
#3

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 11:36
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 13:59
Setze mal das Property UserControl auf False:
Delphi-Quellcode:
ExcelObj:=CreateOleObject('Excel.Application');
ExcelObj.Visible:= false;
ExcelObj.DisplayAlerts:=false;
ExcelObj.UserControl := False;
Andreas
  Mit Zitat antworten Zitat
owow

Registriert seit: 6. Mär 2012
5 Beiträge
 
#5

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 18:27
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:
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
Das ist nicht ganz korrekt beschrieben. Die Verbindung zu Excel, und damit der Prozess Excel.exe wird erst dann beendet nachdem die Prozedur "btnCreateClick" komplett fertig ist (wenn das close_excel im finally Block nicht auskommentiert und damit aktiv ist), deshalb hatte ich die ShowMessage reingemacht um zu verhindern dass die Prozedur beendet wird. Erst nachdem ich dort auf "ok" klicke wird die Verbindung beendet, nicht schon, so wie es sein sollte, nach dem die Prozedur close_excel fertig ist.

@Pitschki1801: was passiert wenn du die

ShowMessage('pause'); als letzten Schritt vor dem letzten "end;" einfügst, wird dann der Excel Prozess vor oder nach dem Klick auf "ok" beendet?
  Mit Zitat antworten Zitat
owow

Registriert seit: 6. Mär 2012
5 Beiträge
 
#6

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 19:08
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?
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 20:03
Excel wird nun schon vor dem Klick auf "OK" korrekt beendet
wieso das funktioniert kann ich mir aber noch nicht erklären, habt ihr eine Idee?
Ich möchte als mir momentan einzig plausible Erklärung vermuten, dass der Referenzzähler auf die Out-of-Process Server-Instanz des COM-Objekts, welches lokal, innerhalb der Prozedur durch späte Bindung erzeugt worden ist, erst beim effektiven Verlassen dieser Prozedur wieder zurückgesetzt wird. Solange aber der Referenzzähler>0 ist, bleibt eben die Server-Instanz (hier: Excel) als Prozess zunächst noch im Speicher erhalten, auch wenn dieses Objekt bereits von Delphi in dessen eigenem Kontext innerhalb der Prozedur auf Unassigned gesetzt worden ist.
  Mit Zitat antworten Zitat
Pitschki1801

Registriert seit: 9. Feb 2012
14 Beiträge
 
Delphi XE Professional
 
#8

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 21:30
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?
  Mit Zitat antworten Zitat
Pitschki1801

Registriert seit: 9. Feb 2012
14 Beiträge
 
Delphi XE Professional
 
#9

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 7. Mär 2012, 09:47
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.
  Mit Zitat antworten Zitat
owow

Registriert seit: 6. Mär 2012
5 Beiträge
 
#10

AW: OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 7. Mär 2012, 10:40
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz