COM库中用于创建组件的三个函数

来源:互联网 发布:mac 查看所有进程 编辑:程序博客网 时间:2024/05/22 15:35

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对象。

0 0
原创粉丝点击