《Inside Com》小结(一)

《Inside Com》小结(一)

      前不久看完了《Inside Com》。书写得非常棒,有了这个基础,打算继续研究《Com  本质论》。下面是我看完此书记录下来的一些东西:

      1. CoCreateInstance 的调用过程(这里的组件位于 DLL 中):

《Inside Com》小结(一)_第1张图片

      图片说明了一切。对比一下 CoCreateInstance 的声明:

WINOLEAPI CoCreateInstance(__in        REFCLSID    rclsid,
__in_opt    LPUNKNOWN   pUnkOuter,
__in        DWORD       dwClsContext,
__in        REFIID      riid,
__deref_out LPVOID FAR* ppv);
    值得一提的是 CoGetClassObject 调用了 Dll 的导出函数 DllGetClassObject ,Regsvr32 /s /u 当然是使用了对应的 DllRegisterServer / DllUnregisterServer 导出函数。如果使用 ATL,这一切繁杂的工作都省却了,但反注册还需手动操作……
    2. 获取聚合组件接口的过程:
    理解组件聚合技术是一次痛苦的经历。前后三天,苦苦思索,我终于在那个阴冷的下午获得了“安东尼达斯”的垂青。如果他早一点给我一瓶智力药水,何至如此呢!看图说话:
《Inside Com》小结(一)_第2张图片 

      其中,两个InUnk都是非代理IUnknown。

      这样一来,对于外部组件来说:

  IX   Outer->QueryInterface
获取    
  IY   InUnkO->QueryInterface

      对于内部组件来说:

  IX   OutUnk->QueryInterface->InUnkO->QueryInterface
获取    
  IY   OutUnk->QueryInterface

 

      所有的 QueryInterface 动作都直接或间接的由外部组件执行。

      这让我想起了《变形金刚2》。假如我一进电影院就睡着了,等到天火和擎天柱组合之后我才醒来。那么对于我来说,擎天柱就是外部组件,IX为跑。天火为内部组件,IY为飞。此时我不知道有天火的存在。当我问擎天柱你会飞吗的时候,他知道他不会飞(没有IY接口),于是他问天火你会不会飞,天火就返回IY(飞)接口,于是擎天柱告诉我他会飞。当他飞着的时候(我想通过IY来查询IX),我问他会跑么,这句话只有天火听得见(因为我用的是IY接口),天火不会跑,他就问擎天柱,擎天柱知道自己会跑(有IX接口),于是就给我一个IX接口。整个过程中,我只知道擎天柱,并不知道天火的存在,于是擎天柱聚合了天火。

      但我怎么可能进去就睡着了呢!

      内部组件的代理接口只是简单的调用外部的QueryInterface,是个转发站,一切工作交由外部组件统筹。关于具体实现,《COM本质论》中给出的 "impunk.h" 头文件中有很好的实现。我非常喜欢其中关于接口查找表的实现,那个offset获取偏移地址的方法让我这个C语言功力薄弱的人感到十分惭愧。

      过两天再把套间线程和自由线程整理出来。

你可能感兴趣的:(《Inside Com》小结(一))