3个函数:
1.CoGetClassObject
2.CoCreateInstance
3.CoCreateInstanceEx
CoGetClassObject
1.创建一个类厂,
2.进程内组件对象,CoGetClassObject调用DLL模块的DLLGetClassObject引出函数创建类厂;
3.进程外组件,CoGetClassObject函数启动组件进程,一直等到组件进程它支持的COM类对象的类厂注册到COM中。
CoCreateInstance
创建COM对象
HRESULTCoCreateInstance(constCLSID& clsid,
IUnknown *pUnknownOuter,
DWORD dwClsContext,
constIID& iid,
(void **)ppv);
CoCreateInstance实现伪码
HRESULTCoCreateInstance(constCLSID& clsid,IUnknown
*pUnknownOuter,DWORD dwClsContedt,
constIID& iid,void *ppv)
{
IClassFactory *pCF;
HRESULT hr;
hr = CoGetClassObject(clsid,dwClsContext,NULL,
IID_IClassFactory,(void*)pCF);
if (FAILED(hr))
return hr;
hr = pCF->CreateInstance(pUnkOuter,iid,(void*)ppv);
pCF->Release();
return hr;
}
CoCreateInstanceEx
创建COM对象
HRESULTCoCreateInstanceEx(constCLSID& clsid,
IUnknown *pUnknownOuter,
DWORD dwClsContext,
COSERVERINFO *pServerInfo,
DWORD dwCount,
MULTI_QI *rgMultiQI);
三个创建函数选用原则
(1)如果客户创建远程对象或者希望一次获取对象的多个接口指针,则选用CoCreateInstanceEx函数;
(2)如果客户希望获取类厂对象或者要调用类厂的某些成员函数,则选用CoGetClassObject函数;
(3)在其他情况下,使用CoCreateInstance函数创建对象。
客户程序调用COM库创建组件对象的顺序
通过CoCreateInstance调用CoGetClassObject;
COM库找到DLL程序并进入进程;
调用DllGetClassObject函数;
DllGetClassObject创建类厂;
DllGetClassObject函数把类厂接口指针返回给CoGetClassObject函数;
CoGetClassObject函数把类厂接口指针返回给CoCreateInstance函数;
CoCreateInstance函数得到类厂后,调用类厂的对象创建函数CreateInstance;
类厂创建COM对象;
类厂把COM对象返回给CoCreateInstance, CoCreateInstance函数返回COM对象接口指针给客户;
客户直接调用COM对象。