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的整个流程
- COM组件的运行机制,即COM是怎么跑起来的
- _ATL_OBJMAP_ENTRY Com中的Object Map是怎么建立起来的
- _ATL_OBJMAP_ENTRY Com中的Object Map是怎么建立起来的
- java运行机制——程序是怎么跑起来的?
- 怎么通俗的解释COM组件?
- Spring 到底是怎么跑起来的
- 程序是怎么跑起来的-1
- 程序是怎么跑起来的-2
- 《程序是怎么跑起来的》读书笔记
- 《程序是怎么跑起来的》
- 1.计算机是怎么跑起来的
- COM组件的使用方法
- COM组件的使用方法
- COM组件的使用
- COM组件的初始化
- com组件的使用
- COM组件是?
- 如何判断是com组件还是普通的dll?
- Freescale iMx51开发
- oracle SCN 详解(原创)
- 跟我一起写 Makefile
- 跳表
- tick
- COM组件的运行机制,即COM是怎么跑起来的
- 2011年SSCI收录信息科学与图书馆学学科期刊86种
- MIPS地址空间
- JSP工程小结
- dw 使用手机模拟器环境
- (转)关于 Debug 和 Release 版本区别
- JAVA中面向对象基础:抽象类、初始化块
- ubuntu 设置中文编码
- C++ string对象读文件