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