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

IUnknown—COM和MFC

 2006-07-21 11:43:14 来源:WEB开发网   
核心提示: //同样也作了简化CCmdTarget* COleObjectFactory::OnCreateObject(){return (CCmdTarget*)m_pRuntimeClass->CreateObject();}一旦COleObjectFactory::XClassFacto

//同样也作了简化
CCmdTarget* COleObjectFactory::OnCreateObject()
{
return (CCmdTarget*)m_pRuntimeClass->CreateObject();
}

一旦COleObjectFactory::XClassFactory::CreateInstance有了你的类实例,便调用InternalQueryInterface获取类的IUnknown接口指针。这里省略了许多细节,例如,在实际代码中MFC要调用IClassFactory2::CreateInstanceLic并检查所有出错条件以及聚合。InternalQueryInterface 和 ExternalQueryInterface之间的差别是外部版本委派外部IUnknown(如果有的话),而内部版本则不然。但即使聚合,最终都要归到InternalQueryInterface。

如果还不明白,不要紧。类工厂的CreateInstance函数创建了一个你的类实例,并调用CCmdTarget::InternalQueryInterface来获取类的IUnknown指针。InternalQueryInterface在哪里得到你的类IUnknown接口指针呢?难以捉摸的QueryInterface又在哪里?

经历了一些步骤和函数调用之后,CCmdTarget::InternalQueryInterface最终要调用一个函数:

LPUNKNOWN CCmdTarget::GetInterface(const void* iid)
{
LPUNKNOWN ptr = NULL;
if (iid == IID_IUnknown) {
ptr = // 接口映射的第一个接口
} else {
ptr = // 在接口映射中查找iid
}
return ptr; // (如果没找到则为NULL)
}

换句话说,如果请求的接口是IUnknown,则GetInterface返回接口映射中的第一个接口指针,否则它查找与请求的接口ID匹配的那一个。这里的诀窍在于:你的类所提供的每一个接口都必须和基类接口一样实现IUnknown,并且还要以相同的方式实现,至于InternalQueryInterface返回哪一个接口指针并不重要。CCmdTarget类自身没有QueryInterface函数,只有嵌套类有,这个嵌套类实现每个接口,每个接口又都实现IUnknown。

上一页  1 2 3 4 5  下一页

Tags:IUnknown COM MFC

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