从品牌网站建设到网络营销策划,从策略到执行的一站式服务
今天我们来分析QueryInterface函数。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名、网页空间、营销软件、网站建设、桃城网站维护、网站推广。
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的一致性。
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图