(200分) TComponent中IUnknown中的用意???(200分)

  • 主题发起人 主题发起人 littlestone08
  • 开始时间 开始时间
L

littlestone08

Unregistered / Unconfirmed
GUEST, unregistred user!
我看了TCOMPONENT的源代码,它里面实现了IUNKNOWN接口,但是并不能支持接口一样的生存期管理,因为它的_ADDREF等操作是对FVCLComComponent操作的.
我想破了脑袋也不知道它实现了IUnKnown接口有什么用途,网上找了好几天,只是说它用来包装
COM类的,也没有具体的东西说明,找不到代码,也想不到它如何包装COM类的.
====================
问题1:TComponent如何来包装Com类??
问题2:从TComponent继承如何能用上它已经实现的IUnknown接口,并实现组件的接口式的生   存期管理?
问题3:TComponent的IUnknown都在什么场合下用??也就是说,Borland实现它肯定是有他自己的用意的,但是这个用意是什么??
===================
先谢过了
 
这么久了,自已再顶
 
我用fastmm测试过,TComponent类实现IUNKNOWN接口没有任何作用,mm照样要报内存泄漏,你需要按照InterfacedObject复写了TComponent的三个接口方法,才能实现生存期管理。
一下是我的修改的TComponent类,其实很简单就是把InterfacedObject三个接口方法照搬过来的,经MM测试没有报内存泄漏,因为没有仔细研究,如有什么不足请各位大富翁指出:


Ti = class(TComponent,IInterface)//也可以自己修改classes.pas的TComponent代码
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
....................................................................................
{ Ti }

function Ti.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;


function Ti._AddRef: Integer;
begin
Result := InterlockedIncrement(FRefCount);
end;

function Ti._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
不知道为什么接口计数没有作用(FRefCount始终为0),请各位大侠指点一下,谢谢!
 
再顶,希望大家说一说,这么久了才一位朋友发表看法
 
好久还只有一个人?是问题太弱??
 
delphi7中改为IInterface接口
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference);
如果所有类继承于TObject一样,所有接口都是继承于IInterface。
提供了3个接口方法:
_AddRef, _Release, QueryInterface;
我以为TComponent 继承 IInterface 用处至少有:
1、可以在IInterface上实现新的接口。
2、可以使用IInterface提供的接口方法。
 
建议那你可以看看李维大师的InsideVCL这本书,在第三章和第七章都介绍了。
TComponent实现了IUnknown,IDispatch,但是并没有实现引用计数自管理。这是和Delphi语言的本身弱点决定的。
第一、实现这个接口,其实TComponent已经支持了COM。只是看看实现代码,发现主要是一个成员变量没有实现:
property VCLComObject: Pointer read FVCLComObject write FVCLComObject;
这个变量类型实际是:IVCLComObject(FVCLComObject)。

另:
IUnknown的实现是由于要实现IDispatch,所有实现接口的类,必须实现它。

应此,派生类,只要实现了这个接口就可以了。
其实这些都是为了方便ActivX控件和VCL的兼容性。
 
TComponent最好不要实现生存期自管理。而是用OWNER的释放来自动释放。
因为TComponent的Components属性是一个容器。记录了他拥有的TComponent。但是Components内部实现是TList,TList记录的仅仅是指针不具有增加引用计数的功能。很有可能会导致问题出现
相反如果Borland的Components使用TComponent集合来实现的话倒是有类型信息可以达到改变引用计数。但是知道他的Owner不释放。这个引用计数就永远达不到0.也没什么意义。
 
多人接受答案了。
 
后退
顶部