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

DNA

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "factory.h"
  3. #include "CompA.h"
  4. extern ULONG    g_LockNumber;
  5. extern ULONG    g_CompANumber;
  6. CAFactory::CAFactory()
  7. {
  8. m_Ref = 0;
  9. }
  10. CAFactory::~CAFactory()
  11. {
  12. }
  13. HRESULT  CAFactory::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   CAFactory::AddRef()
  31. {
  32. m_Ref ++;
  33. return  (ULONG) m_Ref;
  34. }
  35. ULONG   CAFactory::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 CAFactory::CreateInstance(IUnknown *pUnknownOuter, 
  45.    const IID& iid, void **ppv)
  46. {
  47. HRESULT hr;
  48. //  iid must be IID_IUnknown for aggregating 
  49. if ( ( pUnknownOuter != NULL ) && ( iid != IID_IUnknown ) )
  50. {
  51. return CLASS_E_NOAGGREGATION;
  52. }
  53.     *ppv=NULL;
  54. hr=E_OUTOFMEMORY;
  55. //Create the object passing function to notify on destruction.
  56. CA *pObj=new CA (pUnknownOuter);
  57. if (NULL==pObj)
  58. return hr;   
  59.    
  60. //Obtain the first interface pointer (which does an AddRef)
  61. hr = pObj->NondelegationQueryInterface(iid, ppv);
  62.     if (hr != S_OK) {
  63.   //Kill the object if initial creation or FInit failed.
  64. g_CompANumber --; // Reference count g_CompANumber be added in constructor
  65. delete pObj;
  66. }
  67.    
  68. return hr;   
  69. }
  70. HRESULT CAFactory::LockServer(BOOL bLock)
  71. {
  72.    if (bLock)
  73.       g_LockNumber ++;
  74.    else
  75.    {
  76.       g_LockNumber --;
  77.    }
  78.    return NOERROR;
  79. }