COM组件的运行机制,即COM是怎么跑起来的

     这部分我们将构造一个创建COM组件的最小框架结构,然后看一看其内部处理流程是怎样的
IUnknown *pUnk=NULL;
    IObject *pObject=NULL;
    CoInitialize(NULL);
    CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown,
            (void**)&pUnk);
    pUnk->QueryInterface(IID_IOjbect, (void**)&pObject);
    pUnk->Release();
    pObject->Func();
    pObject->Release();
    CoUninitialize();
  CoCreateInstance身上,让我们来看看它内部做了一些什么事情。以下是它内部实现的一个伪代码: 

    CoCreateInstance(....)
    {
      .......
      IClassFactory *pClassFactory=NULL;
      CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory,
            (void **)&pClassFactory);
      pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
      pClassFactory->Release();
      ........
    } 


这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。
  继续深入一步,看看CoGetClassObject的内部伪码:

CoGetClassObject(.....)
    {
      //通过查注册表CLSID_Object,得知组件DLL的位置、文件名
      //装入DLL库
      //使用函数GetProcAddress(...)得到DLL库中函数DllGetClassObject的函数指针。
      //调用DllGetClassObject 
    } 

  DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件.
  下面是DllGetClassObject的伪码: 

   DllGetClassObject(...)
   {
      ......
      CFactory* pFactory= new CFactory; //类厂对象
      pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory);
      //查询IClassFactory指针
      pFactory->Release();
      ......
   }
CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance的伪码:
   CFactory::CreateInstance(.....)
   {
      ...........
      CObject *pObject = new CObject; //组件对象
      pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
      pObject->Release();
      ...........
   } 


下图是从COM+技术内幕中COPY来的一个例图,从图中可以清楚的看到CoCreateInstance的整个流程

                  COM组件的运行机制,即COM是怎么跑起来的_第1张图片

你可能感兴趣的:(COM组件的运行机制,即COM是怎么跑起来的)