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(),其大体的源码以下: 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()函数中完成,所以,用这个函数就能够完成以上的工做。 对象

相关文章
相关标签/搜索