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()函數中完成,所以,用這個函數就能夠完成以上的工做。 對象

相關文章
相關標籤/搜索