Source code of Windows XP (NT5)
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.

166 lines
4.1 KiB

  1. //////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // ApplicationManagerRoot.cpp
  4. //
  5. // Copyright (C) 1998, 1999 Microsoft Corporation. All rights reserved.
  6. //
  7. // Abstract :
  8. //
  9. // This is the IWindowsGameManager code.
  10. //
  11. // History :
  12. //
  13. // 05/06/1999 luish Created
  14. //
  15. //////////////////////////////////////////////////////////////////////////////////////////////
  16. #include "ApplicationManager.h"
  17. #include "AppManDebug.h"
  18. #include "ExceptionHandler.h"
  19. #include "Global.h"
  20. extern LONG g_lDLLReferenceCount;
  21. #ifdef DBG_MODULE
  22. #undef DBG_MODULE
  23. #endif
  24. #define DBG_MODULE DBG_APPMANROOT
  25. //////////////////////////////////////////////////////////////////////////////////////////////
  26. //
  27. //////////////////////////////////////////////////////////////////////////////////////////////
  28. #pragma warning(disable : 4355)
  29. CApplicationManagerRoot::CApplicationManagerRoot(void)
  30. :m_bInsufficientAccessToRun(FALSE),
  31. m_ApplicationManager(this), m_ApplicationManagerAdmin(this), m_EmptyVolumeCache(this)
  32. #pragma warning(default : 4355)
  33. {
  34. FUNCTION("CApplicationManagerRoot::CApplicationManagerRoot (void)");
  35. m_lReferenceCount = 1;
  36. InterlockedIncrement(&g_lDLLReferenceCount);
  37. }
  38. //////////////////////////////////////////////////////////////////////////////////////////////
  39. //
  40. //////////////////////////////////////////////////////////////////////////////////////////////
  41. CApplicationManagerRoot::~CApplicationManagerRoot(void)
  42. {
  43. FUNCTION("CApplicationManagerRoot::~CApplicationManagerRoot (void)");
  44. InterlockedDecrement(&g_lDLLReferenceCount);
  45. }
  46. //////////////////////////////////////////////////////////////////////////////////////////////
  47. //
  48. //////////////////////////////////////////////////////////////////////////////////////////////
  49. STDMETHODIMP CApplicationManagerRoot::QueryInterface(REFIID RefIID, LPVOID *ppVoidObject)
  50. {
  51. FUNCTION("CApplicationManagerRoot::QueryInterface ()");
  52. HRESULT hResult = S_OK;
  53. ///////////////////////////////////////////////////////////////////////////////////////
  54. try
  55. {
  56. if (NULL == &RefIID)
  57. {
  58. THROW(E_UNEXPECTED);
  59. }
  60. *ppVoidObject = NULL;
  61. if (RefIID == IID_IUnknown)
  62. {
  63. *ppVoidObject = (LPVOID) this;
  64. }
  65. else
  66. {
  67. if (RefIID == IID_ApplicationManager)
  68. {
  69. *ppVoidObject = (LPVOID) &m_ApplicationManager;
  70. }
  71. else
  72. {
  73. if (RefIID == IID_ApplicationManagerAdmin)
  74. {
  75. *ppVoidObject = (LPVOID) &m_ApplicationManagerAdmin;
  76. }
  77. else
  78. {
  79. if (RefIID == IID_IEmptyVolumeCache)
  80. {
  81. *ppVoidObject = (LPVOID) &m_EmptyVolumeCache;
  82. }
  83. }
  84. }
  85. }
  86. if (*ppVoidObject)
  87. {
  88. ((LPUNKNOWN)*ppVoidObject)->AddRef();
  89. }
  90. else
  91. {
  92. hResult = E_NOINTERFACE;
  93. }
  94. }
  95. ///////////////////////////////////////////////////////////////////////////////////////
  96. catch(CAppManExceptionHandler * pException)
  97. {
  98. hResult = pException->GetResultCode();
  99. delete pException;
  100. }
  101. catch(...)
  102. {
  103. if ((NULL == &RefIID)||(NULL == ppVoidObject)||(IsBadWritePtr(ppVoidObject, sizeof(LPVOID))))
  104. {
  105. hResult = E_INVALIDARG;
  106. }
  107. else
  108. {
  109. hResult = E_UNEXPECTED;
  110. }
  111. }
  112. ///////////////////////////////////////////////////////////////////////////////////////
  113. return hResult;
  114. }
  115. //////////////////////////////////////////////////////////////////////////////////////////////
  116. //
  117. //////////////////////////////////////////////////////////////////////////////////////////////
  118. STDMETHODIMP_(ULONG) CApplicationManagerRoot::AddRef(void)
  119. {
  120. FUNCTION("CApplicationManagerRoot::AddRef ()");
  121. return InterlockedIncrement(&m_lReferenceCount);
  122. }
  123. //////////////////////////////////////////////////////////////////////////////////////////////
  124. //
  125. //////////////////////////////////////////////////////////////////////////////////////////////
  126. STDMETHODIMP_(ULONG) CApplicationManagerRoot::Release(void)
  127. {
  128. FUNCTION("CApplicationManagerRoot::Release ()");
  129. DWORD dwReferenceCount;
  130. dwReferenceCount = InterlockedDecrement(&m_lReferenceCount);
  131. if (0 == dwReferenceCount)
  132. {
  133. delete this;
  134. }
  135. return dwReferenceCount;
  136. }