首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用C++语言编写COM组件 2

用C++语言编写COM组件 2

注意这里使用了__uuidof(ImyInterface)来获取接口的IID,这是因为我们已经在第一步中将这个接口关联到了某个uuid。
最后一步:COM 组件的DLLs必须输出一个叫DllGetClassObject的函数。由这个函数为CmyInterface创建类工厂并返回一个对它的引用。然后我们调用CoCreateInstance为进程内COM创建类工厂,接着调用DllGetClassObject。这个类工厂有一个方法是CreateInstance,由这个方法创建对象并返回对它的引用。

    STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)  
  • {  *ppvOut = NULL;  
  • if (IsEqualIID(rclsid, CLSID_Mine))  {  
  • // 为CmyInterface类声明类工厂 CClassFactory<CmyInterface>   
  • *pcf = new CClassFactory<CmyInterface>;   return pcf->QueryInterface(riid,ppvOut);  
  • }  return CLASS_E_CLASSNOTAVAILABLE;  
  • }

在此我们要检查所请求的CLSID是不是CLSID_Mine,如果不是则返回一个错误代码。
你可能会问在哪里创建实际的CmyInterface类对象,实际上这是由CClassFactory<CmyInterface>的模板实例来处理的。以下是CClassFatory的实现:

    // CSingleCreator 用于单实例类工厂,这个类为多个CreateObject请求返回相同的对象指针..  
  • template<class comObj>  class CSingleCreator  
  • {  protected:  
  • CSingleCreator():m_pObj(0) {};  comObj *CreateObject()  
  • {  if(!m_pObj)  
  • {  m_pObj = new comObj;  
  • }  return m_pObj;  
  • }  comObj * m_pObj;  
  • };  // CMultiCreator 用于常用类工厂,这个类为每一个CreateObject请求返回新的对象指针..
  • template<class comObj>  class CMultiCreator  
  • {  protected:  
  • CMultiCreator():m_pObj(0) {};  comObj *CreateObject()  
  • {  return new comObj;  
  • }  comObj * m_pObj;  
  • };  //ClassFactory类实现
  • // MultiCreator是缺省的类工厂创建者 //这个类实现了接口IclasFactory......
  • class CClassFactory : public CComBase<>,  
  • public InterfaceImpl<IClassFactory>,  public creatorClass   
  • {  public:  
  • CClassFactory() {};  virtual ~CClassFactory() {};  
  • STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv)  
  • {  *ppv = NULL;  
  • if(IsEqualIID(riid,IID_IUnknown) || IsEqualIID(riid,IID_IClassFactory))  {  
  • *ppv = (IClassFactory *) this;  _AddRef();   
  • return S_OK;  }  
  • return E_NOINTERFACE;  }  
  • STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj)  
  • {  *ppvObj = NULL;  
  • if (pUnkOuter)  return CLASS_E_NOAGGREGATION;  
  • m_pObj = CreateObject(); // m_pObj 在creatorClass中定义 if (!m_pObj)  
  • return E_OUTOFMEMORY;  HRESULT hr = m_pObj->QueryInterface(riid, ppvObj);  
  • if(hr != S_OK)  {  
  • delete m_pObj;  }  
  • return hr;  }  
  • STDMETHODIMP LockServer(BOOL) { return S_OK; } // 未实现
  • };

COM调用CreateInstance创建请求的对象,参数riid指的是所请求的接口IID,如果这个对象支持这个接口,则增加它的引用计数并返回对自身的引用。
关于代码:本文所提出的方法是如何用纯粹的C++编写COM组件的一个大概念。很多方面的细节都省略了。从本文的文字和代码中可以看出用纯C++编写COM组件需要做些什么工作,如果你要用这种方法编写COM组件的话,这些代码只能是抛砖引玉,具体的实现可以在此基础上往下做.
返回列表