WEB开发网
开发学院软件开发VC 编写可复用性更好的C++代码:Band对象和COMToys(9)... 阅读

编写可复用性更好的C++代码:Band对象和COMToys(9)

 2006-07-21 11:45:59 来源:WEB开发网   
核心提示: / 简化后的智能指针代码:// 典型的没有用智能指针实现的 COM 函数,当有多个退出路径时,编写可复用性更好的C++代码:Band对象和COMToys(9)(2),这种做法很糟糕,STDMETHODIMP CExplorerBar::SetSite(IUnknown* punkSite)
///////////////////////////////////////////////////////////////////////
// 简化后的智能指针代码:
// 典型的没有用智能指针实现的 COM 函数,当有多个退出路径时,这种做法很糟糕。
//
//
STDMETHODIMP CExplorerBar::SetSite(IUnknown* punkSite)
{
  // If a site is being held, release it.
  if(m_pSite) {
    m_pSite->Release();
    m_pSite = NULL;
  }
  // If punkSite is not NULL, a new site is being set.
  if (punkSite) {
  ......
   // Get and keep the IInputObjectSite pointer.
    if (SUCCEEDED(punkSite->QueryInterface(IID_IInputObjectSite,
     (LPVOID*)&m_pSite))) {
     return S_OK;
    } 
    return E_FAIL;
  }
  return S_OK;
}
/////////////////////////////////////////////////////////////////////////////////////
// 用智能指针实现的相同的 COM 函数,从 12 行代码减少到 2 行。
// 因为 m_pSite 被声明为 CComQIPtr,没有必要调用 QueryInterface(IID_IInputObjectSite),
// 也没有任何必要调用 AddRef 累加新的指针或调用Release释放旧的指针。智能指针全都搞掂
//
STDMETHODIMP CBandObj::SetSite(IUnknown* punkSite)
{
  if (m_pSite = punkSite) {
  ......
  }
  return punkSite && !m_pSite ? E_FAIL : S_OK;
}   

有关ATL智能指针更深层次的探讨请参考另外一篇专题文章:“用ATL建立轻量级的COM对象”。这篇文章还描述了智能指针可能导致麻烦的罕见情形。 多线程 COMToys并不能实现所有的COM对象,它的应用仅限于外壳扩展。其线程模型是单线程公寓(STA),这种情况下,类成员的线程安全是自动的,并且只有全局量需要保护。有静态成员(全局量)的COMToys类同时也有临界部分,g_mydata,在存取它之前必须锁定。COMToys的一个小类CTLockData可以很轻松完成这种锁定,由构造函数锁定临界部分,而由析构函数进行解锁,所以你要做的只是用下面的代码:

上一页  1 2 3 4 5 6 7  下一页

Tags:编写 复用 更好

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接