起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 359|回复: 19

【结贴】帮忙看一下代码,excel进程不注销。

[复制链接]
发表于 2009-9-8 16:27:18 | 显示全部楼层 |阅读模式
这是写在资源集里的代码,执行后excel不退出啊,内存里有excel进程残留,怎么回事,帮忙看看,急等用啊。
static procedure TQZKZZYJ.GetExcelSheetsName(lExcelFileName : String; var lExcelSheetsName : String; var lCount : Integer);
var
    i:integer;
    oExcel,oWorkbooks,workbook,sbook : Object;
    appExcel,workbooks,sourceworkbook, sourceworksheets, sourceworksheet: System.DispatchHelper;
begin
     oExcel := ComObj.CreateOleObject('Excel.Application');
     appExcel := System.DispatchHelper.Create(oExcel);
     oWorkbooks := appExcel.PropertyGet('WorkBooks',[]);
     try
         workbooks := System.DispatchHelper.Create(oWorkbooks);
         workbook := workbooks.InvokeMethod('Open',[lExcelFileName]);
         sourceworkbook := System.DispatchHelper.Create(workbook);//打开文件
         sbook := sourceworkbook.PropertyGet('Sheets',[]);
         sourceworksheets := System.DispatchHelper.Create(sbook);
         lCount:=ObjectHelper.ToInt(sourceworksheets.PropertyGet('Count',[]));
         lExcelSheetsName:='';
         for i:=1 to lCount do
         begin
             sourceworksheet := System.DispatchHelper.Create(sourceworksheets.PropertyGet('Item',));
             lExcelSheetsName:=lExcelSheetsName+ObjectHelper.ToString(sourceworksheet.PropertyGet('Name',[]))
                             + '`';
         end;
     finally
         //关闭工作簿
         workbooks.InvokeMethod('Close', []);
     end;
     appExcel.InvokeMethod('Quit',[]);
     (sbook as System.IDisposable).Dispose;
     (workbook as System.IDisposable).Dispose;
     (oWorkbooks as System.IDisposable).Dispose;
     (oExcel as System.IDisposable).Dispose;
end;
回复

使用道具 举报

发表于 2009-9-8 16:31:43 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 16:52:25 | 显示全部楼层
经过参考回帖,修改代码如下,仍然不释放excel

static procedure TQZKZZYJ.GetExcelSheetsName(lExcelFileName : String; var lExcelSheetsName : String; var lCount : Integer);
var
    i:integer;
    oExcel : Object;
    appExcel,workbooks,sourceworkbook, sourceworksheets, sourceworksheet : System.DispatchHelper;
begin
     oExcel := ComObj.CreateOleObject('Excel.Application');
     appExcel := System.DispatchHelper.Create(oExcel);
     try
         workbooks := System.DispatchHelper.Create(appExcel.PropertyGet('WorkBooks',[]));
         sourceworkbook := System.DispatchHelper.Create(workbooks.InvokeMethod('Open',[lExcelFileName]));//打开文件
         sourceworksheets := System.DispatchHelper.Create(sourceworkbook.PropertyGet('Sheets',[]));
         lCount:=ObjectHelper.ToInt(sourceworksheets.PropertyGet('Count',[]));
         lExcelSheetsName:='';
         for i:=1 to lCount do
         begin
             sourceworksheet := System.DispatchHelper.Create(sourceworksheets.PropertyGet('Item',));
             lExcelSheetsName:=lExcelSheetsName+ObjectHelper.ToString(sourceworksheet.PropertyGet('Name',[]))
                             + '`';
         end;
     finally
         //关闭工作簿
         workbooks.InvokeMethod('Close', []);
     end;
     appExcel.InvokeMethod('Quit',[]);
     (oExcel as System.IDisposable).Dispose;
end;
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:04:26 | 显示全部楼层
3、我们最头疼的是我们quit后,word或者excel等进程还在进程里面存在。
  有个好办法解决:
  只要是  DispatchHelper.Create  出来的object对象,都要  
  (o2 as System.IDisposable).Dispose;
  所有的都Dispose就不会遗留进程了。
需要注意的
  1、别忘记某个对象的释放。因为bbs上很多
lSelection := DispatchHelper.Create(FApp.PropertyGet('Selection', []));  类似这样的嵌套写法,所以造成了我们忘记释放对象。
   2、注意对象释放的顺序。
   3、PropertyGet出来的object不用释放。如果后面有DispatchHelper.Create语句,是必须释放的。
   例子:o1:= FApp.PropertyGet('Range', ['A3:F3']);
              Range := DispatchHelper.Create(o1);//属性和对象
        o1必须释放。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:14:53 | 显示全部楼层
(sourceworksheets as System.IDisposable).Dispose;
     (sourceworkbook as System.IDisposable).Dispose;
     (workbooks as System.IDisposable).Dispose;
     (oExcel as System.IDisposable).Dispose;
改了以后,运行出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:18:34 | 显示全部楼层
出错图片

111.jpg

42.05 KB, 下载次数: 168

回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:18:53 | 显示全部楼层
哪一行出错?
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:23:18 | 显示全部楼层
oExcel := ComObj.CreateOleObject('Excel.Application');
只要是  DispatchHelper.Create  出来的object对象,都要  
  (o2 as System.IDisposable).Dispose;
这个不应该这样释放吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:23:19 | 显示全部楼层
(sourceworksheets as System.IDisposable).Dispose;
这一行出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:24:50 | 显示全部楼层
我不熟悉delphi,看了论坛的帖子,这样写的,我的目的就是过程执行完毕后,内存里不要有excel进程。不知怎么处理呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-16 07:32 , Processed in 0.046816 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表