COM编程入门:深入COM服务器

来源: 作者: 2007-12-13 出处:pcdog.com

dos  安全  多线程  注册表  
上一页 1 2 3 4 5 6 7 8 9 10 11 12 下一页 

  类工厂实现

  我们的类工厂SimpleMsgBox是在一个叫做CSimpleMsgBoxClassFactory的C++类中实现的:

  class CSimpleMsgBoxClassFactory : public IClassFactory
{
public:
  CSimpleMsgBoxClassFactory();
  virtual ~CSimpleMsgBoxClassFactory();
  // IUnknown方法
  ULONG AddRef();
  ULONG Release();
  HRESULT QueryInterface( REFIID riid, void** ppv );
  // IClassFactory方法
  HRESULT CreateInstance( IUnknown* pUnkOuter, REFIID riid, void** ppv );
  HRESULT LockServer( BOOL fLock );
protected:
  ULONG m_uRefCount;
};
构造函数、析构函数和IUnknown方法都和前面例子中的一样,不同的只有IClassFactory的方法,LockServer(),看起来相当更简单:
HRESULT CSimpleMsgBoxClassFactory::LockServer ( BOOL fLock )
{
  fLock ? g_uDllLockCount++ : g_uDllLockCount--;
  return S_OK;
}

  CreateInstance()是重点。我们说过这个方法负责创建新的CSimpleMsgBoxImpl对象。让我们进一步探讨一下它的原型和参数:

  HRESULT CSimpleMsgBoxClassFactory::CreateInstance ( IUnknown* pUnkOuter,
                          REFIID  riid,
                          void**  ppv );

  第一个参数pUnkOuter只用于聚合的新对象,指向“外部的”COM对象,也就是说,这个“外部”对象将包含此新对象。对象的聚合超出了本文的讨论范围,本文的例子对象也不支持聚合。

  riid 和ppv 与在QueryInterface()中的用法一样——它们是客户端所请求的接口IID和存储接口指针的指针缓冲。

  下面是CreateInstance()的实现。它从参数的有效性检查和参数的初始化开始。

  HRESULT CSimpleMsgBoxClassFactory::CreateInstance ( IUnknown* pUnkOuter,
                          REFIID  riid,
                          void**  ppv )
{
  // 因为不支持聚合,所以这个参数pUnkOuter必须为NULL.
  if ( NULL != pUnkOuter )
    return CLASS_E_NOAGGREGATION;
  //检查指针ppv是不是void*类型
  if ( IsBadWritePtr ( ppv, sizeof(void*) ))
    return E_POINTER;
  *ppv = NULL;
检查完参数的有效性后,就可以创建一个新的对象了。
CSimpleMsgBoxImpl* pMsgbox;
  // 创建一个新的COM对象
  pMsgbox = new CSimpleMsgBoxImpl;
  if ( NULL == pMsgbox )
    return E_OUTOFMEMORY;
最后,用QI()来查询客户端所请求的新对象的接口。如果QI()失败,则这个对象不可用,必须删除它。
HRESULT hrRet;
  // 用QI查询客户端所请求的对象接口
  hrRet = pMsgbox->QueryInterface ( riid, ppv );
  // 如果QI失败,则删除这个COM对象,因为客户端不能使用它(客户端没有
  //这个对象的任何接口)
  if ( FAILED(hrRet) )
    delete pMsgbox;
  return hrRet;
}


更多内容请看PCdog.com--FTP服务器  代理服务器技术  刀片服务器专题
上一页 1 2 3 4 5 6 7 8 9 10 11 12 下一页 
上一篇:应用服务器的技术发展趋势
下一篇:多层C/S的客户端调用服务器端的方法