Delphi2009中的几处问题

http://bbs.2ccc.com/topic.asp?topicid=319928

上有网友问我D2009还有什么问题.就简单的说一下我所发现的.

 

上一段时间一直在用Delphi给其他软件开发一个电子地图的ActiveX控件.

 

Delphi2009已经出到Update4了.有几个问题一直都还没解决.

 

1.泛型类库的一处Bug.Generics.Collections.Pas中

 

constructor TObjectList<T>.Create(AOwnsObjects: Boolean);

begin

  inherited;

  FOwnsObjects := AOwnsObjects;

end;

 

如果用这个方法创建TObjectList<T>的话根本不能用.因为父类中根本就没有Create方法参数是boolean类型的.所以父类的构造方法根本就没用被调用到.很多父类成员没创建.所以在IndexOf什么的时候都会报错.

 

临时的解决方式就是把文件拷贝到工程目录下,把这里的代码改成

 

constructor TObjectList<T>.Create(AOwnsObjects: Boolean);

begin

  inherited Create();

  FOwnsObjects := AOwnsObjects;

end;

 

这个问题我报告给CodeGear.他们也说知道了这个问题.结果Update4发布了,这里还是没有改.

 

2.就是IDL生成Pascal文件的时候LPSTR翻译到PChar,LPWSTR翻译到PWIdeChar.其实Delphi2009中CHar和WideChar是一个东西.LPSTR应该翻译到PAnsiChar才对.CodeGear只是把以前的Delphi的IDL到Pascal的翻译器拿过来了.这里没有做相应的修改.不知道有没有人报告给过CodeGear.

 

3.实现Idispatch的时候我不想用TAutoObject的自动化对象.于是使用了TObjectDispatch结合{$METHODINFO ON}编译开关开发.结果发现如果接口本身不在TLB类型库中出现的而是自己代码定义的一点问题都没有.如果接口本身是在TLB中定义的,加上{$METHODINFO ON}的时候编译会报错Internal error HXXXX.XXXX是数字,我记不住了.没法子只能用自动化对象了

 

4.Themes的单元.finalization节

 

if not IsLibrary then

 

  InternalServices.Free;

 

因为ActiveX组件的OCX本身就是DLL.里面用到了界面相关的VCL控件.结果FastMM4就会报InternalServices内存泄露.大概CodeGear的考虑是BPL卸载的时候不要把整个程序的InternalServices卸载掉.但是如果是普通的DLL,OCX则会有造成泄露.

 

这个问题倒是不大,反正如果不是反复加载卸载就只会泄露一次.不过我还是把它改成

 

  if(InternalServices <> nil) then

  begin

    InternalServices.Free;

    InternalServices := nil;

  end;

 

并把Themes.Pas文件拷贝到当前目录下.这样这个泄露就没有了.

 

5.AXCtrls.PAS单元.

 

我是动态创建ActiveX组件的.结果发现创建几个就会有几个TOleLinkStub的泄露.

 

反复查找到TActiveXControl.Initialize;里面有这样的代码

 

  FOleLinkStub := TOleLinkStub.Create(nil);

  FOleLinkStub._AddRef;//增加引用计数

 

而destructor TActiveXControl.Destroy;里面则是

 

FOleLinkStub := nil;

 

这样引用计数也就减到1.永远减不到0.造成泄露.

 

老办法,把AXCtrls.pas拷贝到当前目录下.

 

修改代码

 

 

  I := FOleLinkStub._AddRef() - 1;//取引用计数,调增加方法,返回的就是引用次数

  FOleLinkStub._Release;    //把刚才增加的引用次数减去

  if(I > 1) then

    FOleLinkStub._Release;

  //

  FOleLinkStub := nil;

 

问题解决.

 

后来看了一下旧版Delphi的代码,发现4,5的问题一直都存在于VCL类库中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值