Advertisement
Guest User

CoCarClassFactory

a guest
Sep 25th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. // -----------------CoCarClassFactory.h
  2. #ifndef _COCARCLASSFACTORY_H
  3. #define _COCARCLASSFACTORY_H
  4.  
  5. #include <Windows.h>
  6. class CoCarClassFactory :
  7. public IClassFactory
  8. {
  9. public:
  10. CoCarClassFactory();
  11. virtual ~CoCarClassFactory();
  12.  
  13. // IUnknown
  14. STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
  15. STDMETHODIMP_(ULONG) AddRef();
  16. STDMETHODIMP_(ULONG) Release();
  17.  
  18. // IClassFactory
  19. STDMETHODIMP LockServer(bool fLock);
  20. STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter,
  21. REFIID riid, void** ppv);
  22. private:
  23. ULONG m_refCount;
  24. };
  25.  
  26. #endif
  27.  
  28.  
  29. // ------------------CoCarClassFactory.cpp
  30. #include "CoCarClassFactory.h"
  31. #include "CoCar.h"
  32.  
  33. extern ULONG g_LockCount;
  34. extern ULONG g_objCount;
  35.  
  36. // Constructor
  37. CoCarClassFactory::CoCarClassFactory()
  38. {
  39. m_refCount = 0;
  40. g_objCount++;
  41. }
  42. // Destructor
  43. CoCarClassFactory::~CoCarClassFactory()
  44. {
  45. g_objCount--;
  46. }
  47.  
  48. // The class factory's IUnknown implementation.
  49. STDMETHODIMP_(ULONG) CoCarClassFactory::AddRef()
  50. {
  51. return ++m_refCount;
  52. }
  53. STDMETHODIMP_(ULONG) CoCarClassFactory::Release()
  54. {
  55. if (--m_refCount == 0)
  56. {
  57. delete this;
  58. return 0;
  59. }
  60. return m_refCount;
  61. }
  62. STDMETHODIMP CoCarClassFactory::QueryInterface(REFIID riid, void** ppv)
  63. {
  64. // Which aspect of me do they want?
  65. if (riid == IID_IUnknown)
  66. {
  67. *ppv = (IUnknown*)this;
  68. }
  69. else if (riid == IID_IClassFactory)
  70. {
  71. *ppv = (IClassFactory*)this;
  72. }
  73. else
  74. {
  75. *ppv = NULL;
  76. return E_NOINTERFACE;
  77. }
  78. ((IUnknown*)(*ppv))->AddRef();
  79. return S_OK;
  80. }
  81.  
  82. // The class factory's IClassFactory implementation
  83. STDMETHODIMP CoCarClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
  84. REFIID riid, void** ppv)
  85. {
  86. if (pUnkOuter != NULL)
  87. return CLASS_E_NOAGGREGATION;
  88.  
  89. CoCar* pCarObj = NULL;
  90. HRESULT hr;
  91.  
  92. pCarObj = new CoCar;
  93. hr = pCarObj->QueryInterface(riid, ppv);
  94. if (FAILED(hr))
  95. delete pCarObj;
  96. return hr;
  97. }
  98. STDMETHODIMP CoCarClassFactory::LockServer(bool fLock)
  99. {
  100. if (fLock)
  101. ++g_LockCount;
  102. else
  103. --g_LockCount;
  104. return S_OK;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement