Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
5.5 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // Dummy.cpp
  7. //
  8. // Description:
  9. // Object Manager implementation.
  10. //
  11. // Maintained By:
  12. // David Potter (DavidP) 14-JUN-2001
  13. // Geoffrey Pease (GPease) 22-NOV-1999
  14. //
  15. //////////////////////////////////////////////////////////////////////////////
  16. #include "Pch.h"
  17. #include "Dummy.h"
  18. DEFINE_THISCLASS("CDummy")
  19. // ************************************************************************
  20. //
  21. // Constructor / Destructor
  22. //
  23. // ************************************************************************
  24. //////////////////////////////////////////////////////////////////////////////
  25. //
  26. // HRESULT
  27. // CDummy::S_HrCreateInstance(
  28. // IUnknown ** ppunkOut
  29. // )
  30. //
  31. //////////////////////////////////////////////////////////////////////////////
  32. HRESULT
  33. CDummy::S_HrCreateInstance(
  34. IUnknown ** ppunkOut
  35. )
  36. {
  37. TraceFunc( "" );
  38. HRESULT hr = S_OK;
  39. CDummy * pdummy = NULL;
  40. Assert( ppunkOut != NULL );
  41. if ( ppunkOut == NULL )
  42. {
  43. hr = THR( E_POINTER );
  44. goto Cleanup;
  45. }
  46. pdummy = new CDummy;
  47. if ( pdummy == NULL )
  48. {
  49. hr = THR( E_OUTOFMEMORY );
  50. goto Cleanup;
  51. }
  52. hr = THR( pdummy->HrInit() );
  53. if ( FAILED( hr ) )
  54. {
  55. goto Cleanup;
  56. }
  57. hr = THR( pdummy->TypeSafeQI( IUnknown, ppunkOut ) );
  58. if ( FAILED( hr ) )
  59. {
  60. goto Cleanup;
  61. }
  62. Cleanup:
  63. if ( pdummy != NULL )
  64. {
  65. pdummy->Release();
  66. }
  67. HRETURN( hr );
  68. } //*** CDummy::S_HrCreateInstance
  69. //////////////////////////////////////////////////////////////////////////////
  70. //
  71. // CDummy::CDummy
  72. //
  73. //////////////////////////////////////////////////////////////////////////////
  74. CDummy::CDummy( void )
  75. : m_cRef( 1 )
  76. {
  77. TraceFunc( "" );
  78. InterlockedIncrement( &g_cObjects );
  79. TraceFuncExit();
  80. } //*** CDummy::CDummy
  81. //////////////////////////////////////////////////////////////////////////////
  82. //
  83. // STDMETHODIMP
  84. // CDummy::HrInit
  85. //
  86. //////////////////////////////////////////////////////////////////////////////
  87. STDMETHODIMP
  88. CDummy::HrInit( void )
  89. {
  90. TraceFunc( "" );
  91. HRESULT hr = S_OK;
  92. // IUnknown stuff
  93. Assert( m_cRef == 1 );
  94. HRETURN( hr );
  95. } //*** CDummy::HrInit
  96. //////////////////////////////////////////////////////////////////////////////
  97. //
  98. // CDummy::~CDummy
  99. //
  100. //////////////////////////////////////////////////////////////////////////////
  101. CDummy::~CDummy( void )
  102. {
  103. TraceFunc( "" );
  104. InterlockedDecrement( &g_cObjects );
  105. TraceFuncExit();
  106. } //*** CDummy::~CDummy
  107. // ************************************************************************
  108. //
  109. // IUnknown
  110. //
  111. // ************************************************************************
  112. //////////////////////////////////////////////////////////////////////////////
  113. //++
  114. //
  115. // CDummy::QueryInterface
  116. //
  117. // Description:
  118. // Query this object for the passed in interface.
  119. //
  120. // Arguments:
  121. // riidIn
  122. // Id of interface requested.
  123. //
  124. // ppvOut
  125. // Pointer to the requested interface.
  126. //
  127. // Return Value:
  128. // S_OK
  129. // If the interface is available on this object.
  130. //
  131. // E_NOINTERFACE
  132. // If the interface is not available.
  133. //
  134. // E_POINTER
  135. // ppvOut was NULL.
  136. //
  137. // Remarks:
  138. // None.
  139. //
  140. //--
  141. //////////////////////////////////////////////////////////////////////////////
  142. STDMETHODIMP
  143. CDummy::QueryInterface(
  144. REFIID riidIn
  145. , LPVOID * ppvOut
  146. )
  147. {
  148. TraceQIFunc( riidIn, ppvOut );
  149. HRESULT hr = S_OK;
  150. //
  151. // Validate arguments.
  152. //
  153. Assert( ppvOut != NULL );
  154. if ( ppvOut == NULL )
  155. {
  156. hr = THR( E_POINTER );
  157. goto Cleanup;
  158. }
  159. //
  160. // Handle known interfaces.
  161. //
  162. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  163. {
  164. *ppvOut = static_cast< IDummy * >( this );
  165. } // if: IUnknown
  166. else if ( IsEqualIID( riidIn, IID_IDummy ) )
  167. {
  168. *ppvOut = TraceInterface( __THISCLASS__, IDummy, this, 0 );
  169. } // else if: IDummy
  170. else
  171. {
  172. *ppvOut = NULL;
  173. hr = E_NOINTERFACE;
  174. } // else
  175. //
  176. // Add a reference to the interface if successful.
  177. //
  178. if ( SUCCEEDED( hr ) )
  179. {
  180. ((IUnknown *) *ppvOut)->AddRef();
  181. } // if: success
  182. Cleanup:
  183. QIRETURN( hr, riidIn );
  184. } //*** CDummy::QueryInterface
  185. //////////////////////////////////////////////////////////////////////////////
  186. //
  187. // STDMETHODIMP_(ULONG)
  188. // CDummy::AddRef
  189. //
  190. //////////////////////////////////////////////////////////////////////////////
  191. STDMETHODIMP_( ULONG )
  192. CDummy::AddRef( void )
  193. {
  194. TraceFunc( "[IUnknown]" );
  195. InterlockedIncrement( &m_cRef );
  196. CRETURN( m_cRef );
  197. } //*** CDummy::AddRef
  198. //////////////////////////////////////////////////////////////////////////////
  199. //
  200. // STDMETHODIMP_(ULONG)
  201. // CDummy::Release
  202. //
  203. //////////////////////////////////////////////////////////////////////////////
  204. STDMETHODIMP_( ULONG )
  205. CDummy::Release( void )
  206. {
  207. TraceFunc( "[IUnknown]" );
  208. LONG cRef;
  209. cRef = InterlockedDecrement( &m_cRef );
  210. if ( cRef == 0 )
  211. {
  212. TraceDo( delete this );
  213. }
  214. CRETURN( cRef );
  215. } //*** CDummy::Release