接触VC之四:COM组件模型基础
2006-07-19 11:36:48 来源:WEB开发网核心提示: 3) IUnknown接口COM模式所有接口必须遵守一定规范,这就是IUnknown接口的出处,接触VC之四:COM组件模型基础(8),每个一接口都必须从这个接口继承,在C++中,组件对象应该结束自己的生命,这样,微软已经为我们把IUnknown定义好了:typedef GUID IID;
3) IUnknown接口
COM模式所有接口必须遵守一定规范,这就是IUnknown接口的出处。每个一接口都必须从这个接口继承。在C++中,微软已经为我们把IUnknown定义好了:
typedef GUID IID;
class IUnknown
{
public:
virtual HRESULT _stdcall QueryInterface(const IID& iid, void **ppv) = 0;
virtual ULONG _stdcall AddRef() = 0;
virtual ULONG _stdcall Release() = 0;
};
注:void *可以指向任何对象。我开始的时候对void*一点都不理解。这里使用的原因是传出与传入指针类型不确定。
QueryInterface函数功能是当我们得到一个接口指针,并且我们想得到另一个接口指针的时候,提供帮助。我们将我们想要得到的接口的标识符传给iid,将把指针的做一个次&来传给ppv。如果QueryInterface成功的话,会返回S_OK。我们指针中就会指向我们想要的接口。
AddRef,Release用于实现引用计数机制。
在二进制系统中,组件对象不像C++环境中对象那样具有明确的生存期。可能会出现这种情况,两个(或者两个以上)的地方(可能是不同的程序之间,也可能是不同的线程之间)同时使用着一个组件对象,如果其中一个地方delete掉了组件对象的话。其它地方不可能会知道,当它们尝试调用这个象的话,轻则导致重伤,重则导致死亡。这不是我们希望看到的。于是,COM模型设制一个引用计数机制。
当一个地方开始使用对象的时候,它必须调用AddRef()一次。当我们使用QueryInterface时候,QueryInterface必须为我们调用一次AddRef()。AddRef()会使组件对象的引用计数增1。当这个地方不再使用对象时,它必须调用Release()一次。Release()会使组件对象的引用计数减1。当组件对象的引用计数变成0,就表明没有人再去使用组件对象了。这时,组件对象应该结束自己的生命。这样,就保证了组件对象生存期间其它程序的安全。
更多精彩
赞助商链接