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;