DCOM(分布式组件对象模型)原理浅析(二)-创新互联

今天我们来分析QueryInterface函数。

为阳原等地区用户提供了全套网页设计制作服务,及阳原网站建设行业解决方案。主营业务为成都做网站、网站建设、阳原网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

 DCOM(分布式组件对象模型)原理浅析(二)

HRESULT CDictionary::QueryInterface(const IID& iid, void **ppv)
{
	if(iid == IID_IUnknown)
	{
		*ppv = (IDictionary*)this;
		((IDictionary*)(*ppv))->AddRef();		
	}elseif(iid == IID_Dictionary)
	{
		*ppv = (IDictionary*)this;
		((IDictionary*)(*ppv))->AddRef();
	}elseif(iid == IID_SpellCheck)
	{
		*ppv = (ISpellCheck*)this;
		((ISpellCheck*)(*ppv))->AddRef();
	}
	else
	{
		*ppv = NULL;
		return E_NOINTERFACE;
	}
	
	return S_OK;	
}

根据COM接口的内存接口以及C++语言中类多重继承的内存结构,我们实现QueryInterface函数。

QueryInterface函数对于iid的三种可能值分别进行了处理,不管客户要想查询字典对象所支持的哪个接口,QueryInterface都会返回相应的接口指针,如图,当我们将this指针转换为基类指针时,所得到的指针正好指向接口的vtable,所以我们用类型转换函数就可以得到每个接口的vtable,也就是接口指针。

在第一个if语句块中,我们并没有把this指针直接转换为IUnknown指针,根据C++语法,由于在CDictionary的基类树中,有两个IUnknown节点,因此直接把this指针转换成IUnknown指针存在二义性。

先把this指针转换成IDictionary或者ISpellCheck,再转换成IUnknown,但必须保证每次查到的IUnknown接口完全一致。

这个程序直接把IDictionary接口指针当做IUnknown接口指针,这样的转换是符合COM规范的。

根据CDictionary的基类树,这里的继承关系不能用虚拟继承,否则就不能保证IDictionary和ISpellCheck的vtable与COM接口的vtable的一致性。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:DCOM(分布式组件对象模型)原理浅析(二)-创新互联
当前路径:http://pwwzsj.com/article/pjhpj.html