接口实现
AddRef
-
CObjRoot中定义_AddRef为纯虚函数,定义m_cRef为引用记数,定义静态指针变量p_ObjCount;
-
CComBase中通过线程模型类实现_AddRef函数,每次m_cRef加1,如果p_ObjCount不为空,则其值加1;
-
InterfaceImpl中通过调用CComBase中的_AddRef实现AddRef;
Release
-
CObjRoot中定义_ Release为纯虚函数,定义m_cRef为引用记数,定义静态指针变量p_ObjCount;
-
CComBase中通过线程模型类实现_Release,每次m_cRef减1,如果m_cRef为0,释放CComBase实例,如果p_ObjCount不为空,则其值减1;
-
InterfaceImpl中通过调用CComBase中的_Release实现Release;
QueryInterface
其他接口
接口创建
CClassFactory中调用creatorClass中的CreateObject方法创建CmyInterface实例(通过模板参数传递创建的对象的类型),通过该实例的QueryInterface获取ImyInterface接口指针;
获取IClassFactory接口指针;
接口使用
-
组件程序要实现并导出函数DllRegisterServer()来注册组件到注册表中,该例程把CLSID_myInterface注册到注册表中
-
客户程序调用CoInitialize(NULL)来初始化COM库
-
客户程序调用CoCreateInstance(CLSID_myInterface, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown,
(void **)&pUnknown);
-
定义一个IClassFactory接口的指针,IClassFactory *pCF;
-
调用CoGetClassObject(CLSID_myInterface, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory,
(void *)pCF)
-
从注册表中找到由CLSID_myInterface所指定的COM对象(dll),并装入dll程序
-
调用DllGetClassObject(CLSID_myInterface, IID_IClassFactory, pCF) 创建类厂
-
定义一个类厂的对象指针:CClassFactory<CmyInterface> * pFactory =
new CClassFactory<CmyInterface>;
-
用类厂的对象指针调用QueryInterface取得类厂对象的IID_IClassFactory接口指针:
-
pFactory->QueryInterface (IID_IClassFactory, pCF);
-
把得到的类厂接口指针pCF返回给DllGetClassObject(..., pCF);
-
DllGetClassObject(..., pCF)函数把类厂接口指针pCF返回给CoGetClassObject(..., pCF)
-
CoGetClassObject(..., pCF)把类厂接口指针pCF返回给CoCreateInstance(..., pUnknown)的pCF;
-
用类厂接口指针pCF调用类厂CClassFactory<CmyInterface>的函数CreateInstance()来创建COM对象:
pCF->CreateInstance(NULL, IID_IUnknown, (void **)&pUnknown);
-
定义一个客户真正需要的COM对象的指针 CmyInterface *pObj = new CmyInterface();
-
调用CmyInterface的QueryInterface():
pObj->QueryInterface (IID_IUnknown, (void **)&pUnknown);
-
类厂指针的操作 pCF->Release()
-
把在B中创建的真正要用的COM对象的接口的指针(IUnknown *类型的指针)返回给
CoCreateInstance(…)的pUnknown .
-
客户用pUnknown指针直接调用COM对象中的函数
IUnknown *pUnknown;
IDictionary *pDictionary;ISpellCheck *pSpellCheck;
pUnknown->QueryInterface(IID_Dictionary, (void **)&pDictionary);
pDictionary->QueryInterface(IID_SpellCheck, (void **)&pSpellCheck);
pDictionary->LoadLibrary(L”animal.dict”) //IDictionary的函数
pSpellCheck->CheckWord(L”lion”, &stringResult); //ISpellCheck的函数