首页  编辑  

内存残留Office进程问题

Tags: /超级猛料/Office.OA自动化/   Date Created:

By Kingron

使用COM调用Office对象,程序释放对象后,进程中还是残留Office进程?

例如下面的代码:

/// 全局变量

var

   SourceExcel,wsheet:variant;

   SourceFileName:string;

begin

...

   SourceExcel:=CreateOleObject('Excel.Application');

   SourceExcel.WorkBooks.Open(SourceFileName);

   SourceExcel.WorkSheets[1].Activate;

   WSheet := SourceExcel.ActiveSheet;

   SourceExcel.visible:=true;

   ...

   SourceExcel.Workbooks.Close;

   SourceExcel.Quit;

   SourceExcel:=unassigned;

...

   运行后,打开的excel窗口被关掉了,但是后台的excel.exe的进程仍在,但是当我关闭怎个delphi程序时,这些excel进程全部没了,郁闷啊,请教各位如何彻底关闭excel啊!但是把上面的代码全局变量改成局部变量就可以了。

其实原因在于写代码的人没有注意:释放对象必须释放所有的变量对象,上面的问题就在于没有释放wsheet对象。

用下面的代码就可以了:

uses ActiveX,ComObj,ShlObj;

var

   SourceExcel,wsheet: olevariant;

   SourceFileName:string='C:\b.bas';

procedure TForm1.Button1Click(Sender: TObject);

begin

   SourceExcel:=CreateOleObject('Excel.Application');

   SourceExcel.WorkBooks.Open(SourceFileName);

   SourceExcel.WorkSheets[1].Activate;

   WSheet := SourceExcel.ActiveSheet;

   SourceExcel.visible:=true;

   SourceExcel.Workbooks.Close;

   SourceExcel.Quit;

   VarClear(wsheet);

   VarClear(SourceExcel);

end;