描述:
在进程内组件开发过程中,我发现CoCreateInstance CoGetClassObject 都会调用 DllGetClassObject,如果DllGetClassObject里如果去实现一个类厂的创建,代码如下:
STDAPI DllGetClassObject(REFCLSID rclsid ,REFIID riid,void **ppv)
{
// changed by venture at 2003-11-12 23:15:00
// start
//在这里创建类厂
if(rclsid==CLSID_MATHCOM)
{
CMathFactory *pFactory = new CMathFactory;
if(pFactory == NULL)
return E_OUTOFMEMORY;
HRESULT hr = pFactory->QueryInterface(riid, ppv);
return hr;
}
// end
return CLASS_E_CLASSNOTAVAILABLE;
}
之后,COM会自动的去调CMathFactory的成员函数CMathFactory::CreateInstance(IUnknown * pUnkOuter,REFIID riid,void ** ppv);
如果,我在这个函数里去实现一个COM对象的创建,那么,也就是说CoCreateInstance 与CoGetClassObject的功能就是完全一样的了???
这使小弟感到一些不安,COM这样设计是为了什么呢?
请各位大虾帮帮小弟,这一切太可怕了,难到是我忽越了什么吗?
解决方案1:
CoCreateInstance调用过程伪代码:
调用CoCetClassObject
获取类厂接口指针
创建对象
使用对象
CoCreateInstance :创建组件的实例.
CoGetClassObject :创建组件的类厂.
CoCreateInstance 的实现如下:
{
IClassFactory * pClassFactory=NULL;
HRESULT hr = CoGetClassObject(CLSID_***,CLSCTX_INPROC,NULL,
IID_IClassFactory,(void**)&pClassFactory);
pClassFactory->CreateInstance(NULL,IID_ISimpleMath,(void**)&pSimpleMath);
}
DllGetClassObject的功能是返回组件的类厂.它被CoGetClassObject函数调用.而不是返回组件.
CoCreateInstance 调用 CoCetClassObject函数
详细请看《COM原理与应用》