头条资讯网_今日热点_娱乐才是你关心的时事

今日热点 时事资讯
娱乐头条才是你关心的新闻
首页 > 头条资讯 > 科技

QueryInterface的几个误用范例

蝎子

当你处理应用程序兼容性方面的问题时候,你会发现一个规律:一些能奏效的解决方案,虽然它可以正常工作,但是也只是恰好能正常工作。今天我们来看看非常著名的COM接口IUnknown的QueryInterface方法被误用的例子。

猿友们可能会问了:这个接口是COM的根接口,为什么还会被人误用呢?

那就让我给你们来”翻译翻译”。

忘记响应IUnknown接口

有时候,COM的开发者会非常兴奋地在代码实现中对QueryInterface请求做着各种响应,但是,唯独他忘记响应IUnknown这个接口了,下面就是一个例子:

以上代码将会返回错误代码:E_NOINTERFACE。

忘记响应对象自身接口

有一些COM对象的方法会返回一个另外一个COM对象,如果你使用这个返回的对象,并查询对象自身的接口,它会疑惑的问你:”啊!嘛呢?”

我们来看下面的例子:

有一些对象的实现中,对查询它自身接口的请求,也只是简单的返回E_NOINTERFACE错误,就好像在对COM对象的使用者说:”嘿,哥们,我不存在哦!”。

忘记响应基类接口

当你尝试实现一个继承接口,这就会加上一条隐含条件,也即:你除了需要实现继承对象的接口,还需要实现基类接口。有些开发者会忘记对基类的QueryInterface的查询请求,而是简单地返回E_NOINTERFACE,下面是一个例子:

忘记实现接口查询的等效原则

原则上来说,下面的代码应该是等效的:

在真实的开发者世界里,有一些COM开发者会编写错误的COM实现代码,而导致上面例子中的第二个CoCreateInstance调用失败。唯一可以成功地创建对象的方式是使用IShellFolder接口里创建它。

忘记设置返回指针为空

当客户传入一个指针的时候,如果我们不支持这一请求,则按照惯例,我们需要经此指针设置为空指针,但是有些COM开发者常常会忘记这样做,我们来看下面的代码:

如果QueryInterface能成功查询都目标接口,则pmbl指针必须被设置为非空,如果失败了,则pmbl必须设置为空,否则,就是不讲武德。

桌面外壳必须有能力支持各种各样充满问题的COM对象,如果这一兼容性被破坏掉了,则客户就会开始不高兴了。一些比较流行的应用程序如果因为以上的原因出问题了,那人们就会说:惊!千万别升级到WindowsXXX版本,因为它不兼容XXX。

有人还会说了:”瞧瞧,Microsoft故意让它的新版本不兼容XXX,是不是又想垄断啊?”

总结

所以,规范的执行还是很重要的。

最后

RaymondChen的《TheOldNewThing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《ThewayspeoplemessupIUnknown::QueryInterface》

未经允许不得转载:头条资讯网_今日热点_娱乐才是你关心的时事 » QueryInterface的几个误用范例

分享到:更多 ()
来源:漫漫开发路 编辑:科技

评论

留言/评论 共有条点评
昵称:
验证码:
匿名发表