快捷搜索:  汽车  科技

QueryInterface的几个误用范例(QueryInterface的几个误用范例)

QueryInterface的几个误用范例(QueryInterface的几个误用范例)在真实的开发者世界里,有一些COM开发者会编写错误的COM实现代码,而导致上面例子中的第二个CoCreateInstance调用失败。唯一可以成功地创建对象的方式是使用IShellFolder接口里创建它。原则上来说,下面的代码应该是等效的:有一些COM对象的方法会返回一个另外一个COM对象,如果你使用这个返回的对象,并查询对象自身的接口,它会疑惑的问你:”啊!嘛呢?”我们来看下面的例子:有一些对象的实现中,对查询它自身接口的请求,也只是简单的返回E_NOINTERFACE错误,就好像在对COM对象的使用者说:”嘿,哥们,我不存在哦!”。当你尝试实现一个继承接口,这就会加上一条隐含条件,也即:你除了需要实现继承对象的接口,还需要实现基类接口。有些开发者会忘记对基类的QueryInterface的查询请求,而是简单地返回E_NOINTERFACE,下面是一个例子:

蝎子

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

猿友们可能会问了:这个接口是COM的根接口,为什么还会被人误用呢?
那就让我给你们来”翻译翻译”。

忘记响应IUnknown接口

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

QueryInterface的几个误用范例(QueryInterface的几个误用范例)(1)


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

忘记响应对象自身接口

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

QueryInterface的几个误用范例(QueryInterface的几个误用范例)(2)

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

忘记响应基类接口

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

QueryInterface的几个误用范例(QueryInterface的几个误用范例)(3)

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

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

QueryInterface的几个误用范例(QueryInterface的几个误用范例)(4)

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

忘记设置返回指针为空

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

QueryInterface的几个误用范例(QueryInterface的几个误用范例)(5)

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

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

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

总结

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

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The ways people mess up IUnknown::QueryInterface》

QueryInterface的几个误用范例(QueryInterface的几个误用范例)(6)

猜您喜欢: