COM基础认识

      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规范规定):
  • IUnknown接口类(其中有三个重要函数)
QueryInterface()负责组件对象上的接口查询
AddRef()增加引用计数
Release()减少引用计数



  • Class Factory:类工厂是一个实现了IClassFactory接口的COM组件
IClassFactory接口的 CreateInstance()中,使用new生成一个COM组件类对象实例。



COM组件三种类型:进程内组件、本地进程组件和远程组件。Filter是一种进程内组件,以DLL形式提供服务。

每个COM组件一个GUID唯一标识。

创建一个COM组件使用CoCreateInstance(),其大致的源码如下:

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()函数中完成,因此,用这个函数就可以完成以上的工作。


你可能感兴趣的:(COM基础认识)