前不久看完了《Inside Com》。书写得非常棒,有了这个基础,打算继续研究《Com 本质论》。下面是我看完此书记录下来的一些东西:
1. CoCreateInstance 的调用过程(这里的组件位于 DLL 中):
图片说明了一切。对比一下 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. 获取聚合组件接口的过程:
理解组件聚合技术是一次痛苦的经历。前后三天,苦苦思索,我终于在那个阴冷的下午获得了“安东尼达斯”的垂青。如果他早一点给我一瓶智力药水,何至如此呢!看图说话:
其中,两个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语言功力薄弱的人感到十分惭愧。
过两天再把套间线程和自由线程整理出来。
posted on 2009-12-05 20:16
崇文 阅读(1195)
评论(3) 编辑 收藏 引用