起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: qujinhai

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

[复制链接]
 楼主| 发表于 2009-9-8 17:28:45 | 显示全部楼层
在看吗?
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:30:41 | 显示全部楼层
我帖子说的很清楚了。
如果报错,你可以一点儿一点儿注释掉。
如果对delphi不熟悉也可以用其他工具写好dll,抄袭论坛上的导入dll的方法也可以。
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:35:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:36:39 | 显示全部楼层
我在发帖之前看过论坛里的帖子,就是你给的那个连接,
(sourceworksheets as System.IDisposable).Dispose;
     (sourceworkbook as System.IDisposable).Dispose;
     (workbooks as System.IDisposable).Dispose;
此三句都注意注释掉,试过了,都出错。
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:37:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:38:46 | 显示全部楼层
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必须释放。

你仔细看看例子和我的说明:
比如上面这个例子,你的写法相当于释放Range,而正确的写法是释放o1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:47:57 | 显示全部楼层
sbook := sourceworkbook.PropertyGet('Sheets',[]);

(sbook as System.IDisposable).Dispose;
这样不对吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:49:34 | 显示全部楼层
还有
workbook := workbooks.InvokeMethod('Open',[lExcelFileName]);
(workbook as System.IDisposable).Dispose;
我一楼的帖子里就是这样写的呀
回复 支持 反对

使用道具 举报

发表于 2009-9-8 17:51:21 | 显示全部楼层
给楼主一个例子

procedure TMAINFORM.Button1Click(Sender: TObject);
var
  openDialog:TOpenDialog;
  o,o1: Object ;
  excelApp,b: DispatchHelper;
begin
  openDialog:=TOpenDialog.Create(nil);
  if openDialog.Execute then
  begin
    o:=ComObj.CreateOleObject('Excel.Application');
    excelApp := DispatchHelper.Create(o);
    o1:=excelApp.PropertyGet('WorkBooks',[]);
  DispatchHelper.Create(o1).InvokeMethod('Open',[openDialog.FileName]);
     excelApp.InvokeMethod('Quit',[]);
     (o1 as System.IDisposable).Dispose;
    (o as System.IDisposable).Dispose;

  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-8 17:58:04 | 显示全部楼层
搞定了,循环里的分开,释放就行了
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-16 07:23 , Processed in 0.036558 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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