Factory.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:2k
源码类别:

DNA

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "factory.h"
  3. #include "dictcomp.h"
  4. extern ULONG    g_LockNumber;
  5. extern ULONG    g_DictionaryNumber;
  6. CDictionaryFactory::CDictionaryFactory()
  7. {
  8. m_Ref = 0;
  9. }
  10. CDictionaryFactory::~CDictionaryFactory()
  11. {
  12. }
  13. HRESULT  CDictionaryFactory::QueryInterface(const IID& iid, void **ppv)
  14. {
  15. if ( iid == IID_IUnknown )
  16. {
  17. *ppv = (IUnknown *) this ;
  18. ((IUnknown *)(*ppv))->AddRef() ;
  19. } else if ( iid == IID_IClassFactory) 
  20. {
  21. *ppv = (IClassFactory *) this ;
  22. ((IClassFactory *)(*ppv))->AddRef() ;
  23. else
  24. {
  25. *ppv = NULL;
  26. return E_NOINTERFACE ;
  27. }
  28. return S_OK;
  29. }
  30. ULONG   CDictionaryFactory::AddRef()
  31. {
  32. m_Ref ++;
  33. return  (ULONG) m_Ref;
  34. }
  35. ULONG   CDictionaryFactory::Release()
  36. {
  37. m_Ref --;
  38. if (m_Ref == 0 ) {
  39. delete this;
  40. return 0;
  41. }
  42. return  (ULONG) m_Ref;
  43. }
  44. HRESULT CDictionaryFactory::CreateInstance(IUnknown *pUnknownOuter, 
  45.    const IID& iid, void **ppv)
  46. {
  47.    CDictionary * pObj;   
  48.    HRESULT hr;
  49.    
  50.    *ppv=NULL;
  51.    hr=E_OUTOFMEMORY;
  52.    if (NULL != pUnknownOuter)
  53.    return CLASS_E_NOAGGREGATION;
  54.    
  55.    //Create the object passing function to notify on destruction.
  56.    pObj=new CDictionary();
  57.    if (NULL==pObj)
  58.       return hr;   
  59.    
  60.    //Obtain the first interface pointer (which does an AddRef)
  61.    hr=pObj->QueryInterface(iid, ppv);
  62.    if (hr != S_OK) {
  63.    //Kill the object if initial creation or FInit failed.
  64.       g_DictionaryNumber --; // Reference count g_cDictionary be added in constructor
  65.   delete pObj;
  66.    }
  67.    
  68.    return hr;   
  69. }
  70. HRESULT CDictionaryFactory::LockServer(BOOL bLock)
  71. {
  72.    if (bLock)
  73.       g_LockNumber ++;
  74.    else
  75.       g_LockNumber --;
  76.    return NOERROR;
  77. }