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

IUnknown—COM和MFC

 2006-07-21 11:43:14 来源:WEB开发网   
核心提示: // DLL 函数创建COM对象类工厂DllGetClassObject(REFCLSID rclsid, // 类 IDREFIID riid,// 接口 IDLPVOID* ppv)// 返回的接口指针实际上,DllGetClassObject得不到你的类实例,IUnknown—COM

// DLL 函数创建COM对象类工厂

DllGetClassObject(REFCLSID rclsid, // 类 ID

REFIID riid,  // 接口 ID

LPVOID* ppv)  // 返回的接口指针

实际上,DllGetClassObject得不到你的类实例,它得到的是类工厂(IClassFactory)实例,通过这个类工厂来创建你得类实例。很怪是不是?MFC提供DllGetClassObject的实现,任务是搜索DLL中的所有类工厂,看看哪个类的ID寓所请求的类ID匹配。MFC是如何知道搜索哪个类工厂呢?当你在编写子记得类代码时,用宏DECLARE_OLECREATE 和 IMPLEMENT_OLECREATE声明并实现你自己这个类的类工厂。尤其是IMPLEMENT_OLECREATE声明一个COleObjectFactory的静态实例,这个对象将自己(通过调用类构造函数  COleObjectFactory::COleObjectFactory)添加到与模块或DLL关联的某个类工厂清单中。结果,给定某个类的ID,DllGetClassObject就知道如何发现与那个类关联的类工厂。

一旦CoCreateInstance有了某个类工厂,它便调用IClassFactory::CreateInstance。在此MFC的COleObjectFactory又提供缺省的实现。

//做了许多精简后

STDMETHODIMP COleObjectFactory::XClassFactory::CreateInstance(...)
{
METHOD_PROLOGUE_EX(COleObjectFactory,
ClassFactory)
……
// 这里省略了许多代码
CCmdTarget* pTarget = pThis->OnCreateObject();
return pTarget->InternalQueryInterface(&riid, ppvObject);
}

这里省略了许多琐碎代码以便突出重点,这些代码包括:创建一个实例和调用InternalQueryInterface。OnCreateObject是个COleObjectFactory的虚拟函数,它通过MFC的运行时类创建你的类实例:

上一页  1 2 3 4 5  下一页

Tags:IUnknown COM MFC

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