WEB开发网
开发学院软件开发VC IUnknown—COM和MFC 阅读

IUnknown—COM和MFC

 2006-07-21 11:43:14 来源:WEB开发网   
核心提示: 图一是一个典型的COM类实现,.CPP文件说明了你必须为你的类所提供的每一个接口编写同样烦人IUnknown实现,IUnknown—COM和MFC(4),每一个IUnknown方法为父类(从CcmdTarget派生)调用相应的ExternalXxx(或者InternalXxx—

图一是一个典型的COM类实现。.CPP文件说明了你必须为你的类所提供的每一个接口编写同样烦人IUnknown实现。每一个IUnknown方法为父类(从CcmdTarget派生)调用相应的ExternalXxx(或者InternalXxx——如果你不想要聚合)方法。这个实现对于你编写的每一个接口都一样。这是没有办法的,因为所有的接口都通过相同的单对象在内存中被实例化。AddRef 和Release必须增加和减少相同的物理指针——与AddRef 或Release实际属于哪个接口(嵌套类)无关。此乃高招所在。

这就是为什么在IUnknown的情况下只有InternalQueryInterface能返回你的接口映射中的第一个接 口指针。由于仅仅实现IUnknown的类没什么用,所以在你的映射中至少还要实现一个接口。如果你不明白,下面是具体步骤的解释:

1、客户端调用CoCreateInstance创建你的类实例。

2、CoCreateInstance查找并加载DLL,调用DllGetClassObject

3、DllGetClassObject搜索DLLs的类工厂清单找出与类工厂匹配的类ID,然后返回这个类工厂的指针。

4、CoCreateInstance调用IClassFactory::CreateInstance创建你的应用实例。

5、COleObjectFactory::XClassFactory::CreateInstance 调用 CRuntimeClass::CreateInstance在内存中创建你的MFC类实例。然后CreateInstance调用InternalQueryInterface获取你的类IUnknown接口指针。InternalQueryInterface依次调用CCmdTarget::GetInterface.。

6、如果所请求的接口是IUnknown以外的其它接口,则GetInterface在你的类接口映射中查找这个接口。否则,GetInterface返回你的类接口映射中的第一个接口指针。这个工作对于实现IUnknown的每一个嵌套类都是一样的。

上一页  1 2 3 4 5  下一页

Tags:IUnknown COM MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接