如何实现ie里的自写的ToolBar类型知道自己是最后一个还活着的实例? ( 积分: 100 )

最后这样写总算可以编译通过了并运行了,但令我愤怒的是任何一个 IE关掉都会报告Result=0。我很沮丧,有种被嘲弄的感觉
==========
function Txxxxx._Release: integer;stdcall;
var
COTemp:TComObject;
begin
COTemp:=Self;
Result:=COTemp.ObjRelease;
if Result=0 Then ShowMessage(IntToStr(Result));
end;
 
很正常.每个IE窗口的toolBand不是一个 ,是不同的实例,你要做的是在类上的记数,而不是实例的记数.你应该用个全局变量来做,注意搞好同步,而不要直接去读实例的记数.
你申明一个变量,addref的时候加,release的时候减.同步要做好.
 
本来以为com可以自动累计引用次数,没想到每个ie的弹出都有一个和别的ie不相干的com引用计数,那和在工具条窗口里oncreate/ondestroy里面添加代码是一回事,没有任何特别的好处.

俺对这个结果非常失望,觉得白花了许多时间.
 
这个问题的尝试最终否定了satanmonkey方案.

最后我采取的方案与jerry529相同.此外为了解决注册表错误纪录的问题,增加了在oncreate事件中检查是否已经出现同类的倥件,如果没有,就把引用数纪录置零.如果不这样,任何一次非正常退出都可能导致引用纪录永远错误.

效果是第一个ie窗口打开时遍历所有桌面控件会比较慢;以后的检查在得到第一个结果时就终止遍历,所以影响不大.很少遇到同时打开两个窗口的情形,所以不做同步的控制.

com的toolbar是dll,要弄全局变量相当麻烦;还得要求这个全局变量是在内存里而不是在硬盘文件里,否则都会有错误纪录不能在关机后消除的问题.所以还是算了.
 
procedure TIEClassFac.UpdateRegistry(Register: Boolean);
注册类型,否则UpdateRegistry里面的东西永远别想执行
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
892
DelphiTeacher的专栏
D
顶部