COM基本认识:COM组件就是一个接口全为纯虚类的C++类。如何理解?看代码 框架
Class Ifunction { public: virtual Method1(...)=0; virtual Method2(...)=0; }; class MyObject : public Ifuntion //MyObject就是COM组件 { public: virtual Method1() {...} virtual Method2() {...} }COM有两个重要的成员(COM规范规定):
QueryInterface()负责组件对象上的接口查询 AddRef()增长引用计数 Release()减小引用计数
IClassFactory接口的 CreateInstance()中,使用new生成一个COM组件类对象实例。
COM组件三种类型:进程内组件、本地进程组件和远程组件。Filter是一种进程内组件,以DLL形式提供服务。 函数
每一个COM组件一个GUID惟一标识。 指针
建立一个COM组件使用CoCreateInstance(),其大体的源码以下: code
HRESULT CoCreateInstance(...) { ... IClassFactory *pClassFactory = NULL; CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER,NULL,IID_CLASSFACTORY,(void **)&pClassFactory); //经过GUID得到建立这个组件的对象的类工厂 pClassFactory->CreateInstance(); //调用类工厂的接口方法IClassFactory::CreateInstance()真正建立组件对象 pClassFactory->Release(); ... } 其中的函数CoGetClassObject(...) { //经过查询注册表CLSID_Object得知组件DLL文件路径 //LoadLibrary() //用GetProcAddress()获得DllGetClassObject的函数指针 //调用DllGetClassObject()获得类工厂对象指针 } 其中的函数DllGetClassObject(...) //COM组件中(必须)导出的一个函数 { //根据指定的组件GUID建立相应的类工厂对象,并返回这个类工厂的IClassFactory接口 CFactory *pFactory = new CFactory; //建立类工厂对象 pFactory->QueryInterface(IID_IClassFactory,(void **)&pClassFactory); //查询获得IClassFactory接口 pFactory->Release(); // ... } CFactory::CreateInstance(...) //负责最终建立组件对象实例 { //建立CLSID_Object对应的组件对象 CObject *pObject = new CObject; //CObject 就是组件类,COM框架之外的真正的组件功能就是它实现的 pObject->QueryInterface(IID_IUnkown,(void**)&pUnk); pObject->Release(); // ... }
以上都在CoCreateInstance()函数中完成,所以,用这个函数就能够完成以上的工做。 对象