利用纯C++实现COM

 

利用纯C++实现COM

来源:不详 (2006-07-10 17:18:47)

描述: 接口实现类图
图片:
描述: 接口创建类图
图片:

接口实现

AddRef

  • CObjRoot中定义_AddRef为纯虚函数,定义m_cRef为引用记数,定义静态指针变量p_ObjCount
  • CComBase中通过线程模型类实现_AddRef函数,每次m_cRef1,如果p_ObjCount不为空,则其值加1
  • InterfaceImpl中通过调用CComBase中的_AddRef实现AddRef

Release

  • CObjRoot中定义_ Release为纯虚函数,定义m_cRef为引用记数,定义静态指针变量p_ObjCount
  • CComBase中通过线程模型类实现_Release,每次m_cRef1,如果m_cRef0,释放CComBase实例,如果p_ObjCount不为空,则其值减1
  • InterfaceImpl中通过调用CComBase中的_Release实现Release

QueryInterface

  • InterfaceImpl中定义QueryInterface为纯虚函数;
  • CmyInterface中实现QueryInterface,成功则将对象转化为ImyInterface指针并调用CComBase中的_AddRef函数;

其他接口

  • ImyInterface中定义其他接口为纯虚函数;
  • CmyInterface中实现其他接口;

 

 

接口创建

  • CreateInstance

       CClassFactory中调用creatorClass中的CreateObject方法创建CmyInterface实例(通过模板参数传递创建的对象的类型),通过该实例的QueryInterface获取ImyInterface接口指针;

  • QueryInterface

       获取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();
    • 调用CmyInterfaceQueryInterface(): 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
的函数

  • 客户调用CoUninitialize(),在程序退出前,终止COM库服务函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值