当我学习COM的聚集,我知道COuterclass::pUnkInner
点CInnerclass::INondelegationUnknown
接口,而CInnerclass::QueryInterface
不属于INondelegationUnknown
,为什么pUnkInner
可以调用QueryInterface
,例如,pUnkInner->QueryInterface
。为什么pUnkInner可以在COM的聚合中调用QueryInterface?
0
A
回答
0
不知道什么INondelegationUnknown
是 - 这不是COM的一部分,可能特定于您正在使用的框架。
但是关键的一点是,这种聚合的内部对象必须提供两种不同的实现方式IUnknown
。一种是委托实现 - 当聚合关系第一次建立时,它将所有调用转发给外部提供的IUnknown
指针CoCreateInstance
。内部暴露的所有接口都必须以这种方式实现它们的三个IUnknown
方法。外部人员将这些接口交给外部客户端 - 通过委托给外部,维持单个无缝对象的错觉。
其他IUnknown
实现管理引用计数并公开由内部对象本身实现的接口(如常规COM对象) - 这是非委托实现,外部类用于管理内部对象。它从未暴露于外部。外层在其自己的QueryInterface
实现中使用这个非委托指针来获取由内层实现的接口(然后将它们交给客户端),并最终释放内层。
相关问题
- 1. 为什么我试图COM聚集
- 2. 可以聚合根实体调用库
- 3. InvalidCastException,在COM组件上调用QueryInterface失败
- 4. 为什么子查询中的聚合必须再次聚合?
- 5. 在CoCreateInstance之前调用QueryInterface?
- 6. 有什么办法可以用OllyDbg调试.COM文件吗?
- 7. 为什么Mongo聚合不起作用?
- 8. 是否可以在Silverlight客户端中聚合wcf调用?
- 9. 聚合物可以在javascript
- 10. 什么是“聚合”
- 11. 为什么不__dict__可以被调用
- 12. 为什么cd可以调用函数':'?
- 13. 为什么我的聚合组不会?
- 14. 为什么绑定在聚合物元素中不起作用?
- 15. 为什么在Cassandra表中使用复合聚集键?
- 16. 为什么可以在类型字段中的类中混合?
- 17. 什么聚合函数可以与sparklyr中的sdf_pivot一起使用?
- 18. 聚合物:我可以使用聚合物的
- 19. 为什么可以创建一个COM接口的新实例?
- 20. 为什么你可以在'initialize'中调用instance_eval(而不是class_eval)?
- 21. 为什么使用ruby 1.9中的===可以调用procs?
- 22. django中的聚合之后是什么?
- 23. Vertica中的预聚合表是什么
- 24. 为什么<核心图标集>可以没有“进口”聚合物
- 25. 为什么我可以调用阴影中的函数?
- 26. SQL聚合调用
- 27. 是否可以从Java调用COM API?
- 28. 可以聚合初始化引用聚合中的前一个元素吗?
- 29. 我可以使用什么类型的聚合来创建索引视图
- 30. 为什么不在data.table中首先聚合行
您可以*总是*调用接口指针上的QueryInterface。您可能错过的细节是INondelegationUnknown从IUnknown派生,就像所有的COM接口一样。因此继承了三种IUnknown方法。我们从这里看不到它,但这是正常的方式。 –
从哪里学习COM? – acelent