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

来源:互联网 发布:网络购物系统开题报告 编辑:程序博客网 时间:2024/05/16 10:15
     这部分我们将构造一个创建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的整个流程

                 

原创粉丝点击