手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

非COM环境下的接口编程--问题,技巧,应用(一)

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

FList[FooNum-1]:=TFoo.Create;

(FList[FooNum-1] as IUnKnown)._AddRef;

result:=FList[FooNum-1] as IFoo;

end;

好了,似乎我们已经克服了所有的困难,是这样吗?不是,麻烦马上又出现了!当我们这个时候调用工厂类的DelAFoo方法时会抛出更多的异常!。当我们释放对象的时候会调用到TinterfaceObjectfree方法,在调用这个方法前编译器会自动调用TInterfacedObject.BeforeDestruction方法(事实上这是一个从Tobject继承下来的方法,但在Tobject中它没有任何的实现),这个方法代码如下:

procedure TInterfacedObject.BeforeDestruction;

begin

if RefCount <> 0 then

Error(reInvalidPtr);

end;

看到这里问题明白了吧,由于我们手动增加了引用计数值,使那个值在释放对象前也不会为0,而上面的代码在引用计数值为0的时候会抛出一个异常。解决这个问题的办法很简单,我们只需要再自己定义一个我们的TinterfacedObjectTourInterfacedObject,在这个类中复写(override,因为这是一个虚函数)BeforeDestruction,让它的代码部分空白:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!