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.

254 lines
5.5 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1995 - 1995.
  5. //
  6. // File: ole.cxx
  7. //
  8. // Contents: Class factory, etc, for all OLE objects
  9. //
  10. // History: 25-Sep-95 BruceFo Created
  11. //
  12. //----------------------------------------------------------------------------
  13. #include "headers.hxx"
  14. #pragma hdrstop
  15. #include <initguid.h>
  16. #include "guids.h"
  17. #include "ole.hxx"
  18. #include "ext.hxx"
  19. //////////////////////////////////////////////////////////////////////////////
  20. //////////////////////////////////////////////////////////////////////////////
  21. ULONG g_ulcInstancesNetObj = 0;
  22. //////////////////////////////////////////////////////////////////////////////
  23. //////////////////////////////////////////////////////////////////////////////
  24. STDMETHODIMP
  25. CNetObj::QueryInterface(
  26. IN REFIID riid,
  27. OUT LPVOID* ppvObj
  28. )
  29. {
  30. appDebugOut((DEB_ITRACE, "CNetObj::QueryInterface..."));
  31. *ppvObj = NULL;
  32. IUnknown* pUnkTemp = NULL;
  33. HRESULT hr = S_OK;
  34. if (IsEqualIID(IID_IUnknown, riid))
  35. {
  36. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "IUnknown\n"));
  37. pUnkTemp = (IUnknown*)(IShellExtInit*) this; // doesn't matter which
  38. }
  39. else
  40. if (IsEqualIID(IID_IShellExtInit, riid))
  41. {
  42. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "IShellExtInit\n"));
  43. pUnkTemp = (IShellExtInit*) this;
  44. }
  45. else
  46. if (IsEqualIID(IID_IShellPropSheetExt, riid))
  47. {
  48. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "IShellPropSheetExt\n"));
  49. pUnkTemp = (IShellPropSheetExt*) this;
  50. }
  51. else
  52. {
  53. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "unknown interface\n"));
  54. hr = E_NOINTERFACE;
  55. }
  56. if (pUnkTemp != NULL)
  57. {
  58. pUnkTemp->AddRef();
  59. }
  60. *ppvObj = pUnkTemp;
  61. return hr;
  62. }
  63. STDMETHODIMP_(ULONG)
  64. CNetObj::AddRef(
  65. VOID
  66. )
  67. {
  68. ULONG cInst = InterlockedIncrement((LONG*)&g_ulcInstancesNetObj);
  69. ULONG cRef = InterlockedIncrement((LONG*)&_uRefs);
  70. appDebugOut((DEB_ITRACE, "CNetObj::AddRef, local: %d, DLL: %d\n", cRef, cInst));
  71. return cRef;
  72. }
  73. STDMETHODIMP_(ULONG)
  74. CNetObj::Release(
  75. VOID
  76. )
  77. {
  78. appAssert( 0 != g_ulcInstancesNetObj );
  79. InterlockedDecrement((LONG*)&g_ulcInstancesNetObj);
  80. appAssert( 0 != _uRefs );
  81. ULONG cRef = InterlockedDecrement((LONG*)&_uRefs);
  82. appDebugOut((DEB_ITRACE,
  83. "CNetObj::Release, local: %d, DLL: %d\n",
  84. cRef,
  85. g_ulcInstancesNetObj));
  86. if (0 == cRef)
  87. {
  88. delete this;
  89. }
  90. return cRef;
  91. }
  92. //////////////////////////////////////////////////////////////////////////////
  93. STDMETHODIMP
  94. CNetObjCF::QueryInterface(REFIID riid, LPVOID* ppvObj)
  95. {
  96. appDebugOut((DEB_ITRACE, "CNetObjCF::QueryInterface..."));
  97. *ppvObj = NULL;
  98. IUnknown* pUnkTemp = NULL;
  99. HRESULT hr = S_OK;
  100. if (IsEqualIID(IID_IUnknown, riid))
  101. {
  102. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "IUnknown\n"));
  103. pUnkTemp = (IUnknown*) this;
  104. }
  105. else if (IsEqualIID(IID_IClassFactory, riid))
  106. {
  107. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "IClassFactory\n"));
  108. pUnkTemp = (IClassFactory*) this;
  109. }
  110. else
  111. {
  112. appDebugOut((DEB_ITRACE | DEB_NOCOMPNAME, "unknown interface\n"));
  113. hr = E_NOINTERFACE;
  114. }
  115. if (pUnkTemp != NULL)
  116. {
  117. pUnkTemp->AddRef();
  118. }
  119. *ppvObj = pUnkTemp;
  120. return hr;
  121. }
  122. STDMETHODIMP_(ULONG)
  123. CNetObjCF::AddRef()
  124. {
  125. ULONG cInst = InterlockedIncrement((LONG*)&g_ulcInstancesNetObj);
  126. appDebugOut((DEB_ITRACE, "CNetObjCF::AddRef, DLL: %d\n", cInst));
  127. return cInst;
  128. }
  129. STDMETHODIMP_(ULONG)
  130. CNetObjCF::Release()
  131. {
  132. appAssert( 0 != g_ulcInstancesNetObj );
  133. ULONG cRef = InterlockedDecrement((LONG*)&g_ulcInstancesNetObj);
  134. appDebugOut((DEB_ITRACE,
  135. "CNetObjCF::Release, DLL: %d\n",
  136. cRef));
  137. return cRef;
  138. }
  139. STDMETHODIMP
  140. CNetObjCF::CreateInstance(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObj)
  141. {
  142. appDebugOut((DEB_ITRACE, "CNetObjCF::CreateInstance\n"));
  143. if (pUnkOuter != NULL)
  144. {
  145. // don't support aggregation
  146. return E_NOTIMPL;
  147. }
  148. CNetObj* pNetObj = new CNetObj();
  149. if (NULL == pNetObj)
  150. {
  151. return E_OUTOFMEMORY;
  152. }
  153. HRESULT hr = pNetObj->QueryInterface(riid, ppvObj);
  154. pNetObj->Release();
  155. if (FAILED(hr))
  156. {
  157. hr = E_NOINTERFACE; // FEATURE: Whats the error code?
  158. }
  159. else
  160. {
  161. hr = S_OK;
  162. }
  163. return hr;
  164. }
  165. STDMETHODIMP
  166. CNetObjCF::LockServer(BOOL fLock)
  167. {
  168. //
  169. // FEATURE: Whats supposed to happen here?
  170. //
  171. return S_OK;
  172. }
  173. //////////////////////////////////////////////////////////////////////////////
  174. //////////////////////////////////////////////////////////////////////////////
  175. STDAPI
  176. DllCanUnloadNow(
  177. VOID
  178. )
  179. {
  180. if (0 == g_ulcInstancesNetObj
  181. && 0 == g_NonOLEDLLRefs
  182. )
  183. {
  184. return S_OK;
  185. }
  186. else
  187. {
  188. return S_FALSE;
  189. }
  190. }
  191. CNetObjCF cfNetObj;
  192. STDAPI
  193. DllGetClassObject(
  194. REFCLSID cid,
  195. REFIID iid,
  196. LPVOID* ppvObj
  197. )
  198. {
  199. appDebugOut((DEB_TRACE, "DllGetClassObject\n"));
  200. HRESULT hr = E_NOINTERFACE;
  201. if (IsEqualCLSID(cid, CLSID_CNetObj))
  202. {
  203. hr = cfNetObj.QueryInterface(iid, ppvObj);
  204. }
  205. return hr;
  206. }