一个简单有关问题,以前认为搞懂了,现在却再次糊涂了!关于CoGetClassObject()和DllGetClassObject()和类厂

一个简单问题,以前认为搞懂了,现在却再次糊涂了!关于CoGetClassObject()和DllGetClassObject()和类厂
如果我实现一个进程内服务器,就是一个DLL,是不是非要实现一个DllGetClassObject()来供CoGetClassObject()调用?

这二者关系如何?也就是说,二者的参数有什么对应关系吗?

类厂是自己实现的对吧?类厂和COM之间的关系怎样呀?

------解决方案--------------------
1 DLLs that support the Component Object Model (COM) must implement DllGetClassObject
2 A class factory is a COM object dedicated to creating another COM object. Each class factory has one type of object that it creates.
------解决方案--------------------
进程内COM必须有DllGetClassObject,不然你怎么创建COM对象啊.
------解决方案--------------------
DllGetClassObject是对CoGetClassObject的封装简化使用,CoGetClassObject属于atl的api,而DllGetClassObject不是,是封装函数.
你说得那些atl库都能用向导帮你做好,不必你操心了。要是本着学习精神,可以进atl src瞅瞅

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _Module.GetClassObject(rclsid, riid, ppv);
}

// Obtain a Class Factory (DLL only)
HRESULT GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return AtlModuleGetClassObject(this, rclsid, riid, ppv);
}


ATLINLINE ATLAPI AtlModuleGetClassObject(_ATL_MODULE* pM, REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
ATLASSERT(pM != NULL);
if (pM == NULL)
return E_INVALIDARG;
ATLASSERT(pM-> m_pObjMap != NULL);
_ATL_OBJMAP_ENTRY* pEntry = pM-> m_pObjMap;
HRESULT hRes = S_OK;
if (ppv == NULL)
return E_POINTER;
*ppv = NULL;
while (pEntry-> pclsid != NULL)
{
if ((pEntry-> pfnGetClassObject != NULL) && InlineIsEqualGUID(rclsid, *pEntry-> pclsid))
{
if (pEntry-> pCF == NULL)
{
EnterCriticalSection(&pM-> m_csObjMap);
if (pEntry-> pCF == NULL)
hRes = pEntry-> pfnGetClassObject(pEntry-> pfnCreateInstance, IID_IUnknown, (LPVOID*)&pEntry-> pCF);
LeaveCriticalSection(&pM-> m_csObjMap);
}
if (pEntry-> pCF != NULL)
hRes = pEntry-> pCF-> QueryInterface(riid, ppv);
break;
}
pEntry = _NextObjectMapEntry(pM, pEntry);
}
if (*ppv == NULL && hRes == S_OK)
hRes = CLASS_E_CLASSNOTAVAILABLE;
return hRes;
}


_NextObjectMapEntry就是类长map。一个atl工程有多个com组件,每个对于一个类长,所以需要一个map来记录。
------解决方案--------------------
8好意思,错了。CoGetClassObject更强大,可以创建远程组件,可以一次创建多个组件,在网络环境下减少通信负担。over。。。
------解决方案--------------------
OLE does not provide this function. DLLs that support the OLE Component Object Model (COM) must implement DllGetClassObject in OLE object handlers or DLL applications.

貌似这个是COM---DLL的必须输出函数
------解决方案--------------------
在DllGetClassObject创建类厂,并返回类厂对象的接口指针!

如果是进程内组件对象的话,CoGetClassObject调用dll模块的导出函数DllGetClassObject

并将指定组件代码的clsid,类厂接口IID和存放类厂对象的接口指针 对应的传进去!