SMBSMPEX.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1997 <company name>
  4. //
  5. // Module Name:
  6. // SmbSmpEx.cpp
  7. //
  8. // Abstract:
  9. // Implementation of the CSmbSmpApp class and DLL initialization
  10. // routines.
  11. //
  12. // Author:
  13. // <name> (<e-mail name>) Mmmm DD, 1997
  14. //
  15. // Revision History:
  16. //
  17. // Notes:
  18. // NOTE: You must use the MIDL compiler from NT 4.0,
  19. // version 3.00.44 or greater
  20. //
  21. /////////////////////////////////////////////////////////////////////////////
  22. #include "stdafx.h"
  23. #include <initguid.h>
  24. #include <CluAdmEx.h>
  25. #include "SmbSmpEx.h"
  26. #include "ExtObj.h"
  27. #include "BasePage.h"
  28. #include "RegExt.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. #define IID_DEFINED
  35. #include "ExtObjID_i.c"
  36. CComModule _Module;
  37. #pragma warning(disable : 4701) // local variable may be used without having been initialized
  38. #include <atlimpl.cpp>
  39. #pragma warning(default : 4701)
  40. BEGIN_OBJECT_MAP(ObjectMap)
  41. OBJECT_ENTRY(CLSID_CoSmbSmpEx, CExtObject)
  42. END_OBJECT_MAP()
  43. /////////////////////////////////////////////////////////////////////////////
  44. // Global Function Prototypes
  45. /////////////////////////////////////////////////////////////////////////////
  46. STDAPI DllCanUnloadNow(void);
  47. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv);
  48. STDAPI DllRegisterServer(void);
  49. STDAPI DllUnregisterServer(void);
  50. STDAPI DllRegisterCluAdminExtension(IN HCLUSTER hcluster);
  51. STDAPI DllUnregisterCluAdminExtension(IN HCLUSTER hcluster);
  52. /////////////////////////////////////////////////////////////////////////////
  53. // class CSmbSmpApp
  54. /////////////////////////////////////////////////////////////////////////////
  55. class CSmbSmpApp : public CWinApp
  56. {
  57. public:
  58. virtual BOOL InitInstance();
  59. virtual int ExitInstance();
  60. };
  61. /////////////////////////////////////////////////////////////////////////////
  62. // The one and only CSmbSmpApp object
  63. CSmbSmpApp theApp;
  64. /////////////////////////////////////////////////////////////////////////////
  65. //++
  66. //
  67. // CSmbSmpApp::InitInstance
  68. //
  69. // Routine Description:
  70. // Initialize this instance of the application.
  71. //
  72. // Arguments:
  73. // None.
  74. //
  75. // Return Value:
  76. // Any return codes from CWinApp::InitInstance().
  77. //
  78. //--
  79. /////////////////////////////////////////////////////////////////////////////
  80. BOOL CSmbSmpApp::InitInstance(void)
  81. {
  82. _Module.Init(ObjectMap, m_hInstance);
  83. return CWinApp::InitInstance();
  84. }  //*** CSmbSmpApp::InitInstance()
  85. /////////////////////////////////////////////////////////////////////////////
  86. //++
  87. //
  88. // CSmbSmpApp::ExitInstance
  89. //
  90. // Routine Description:
  91. // Deinitialize this instance of the application.
  92. //
  93. // Arguments:
  94. // None.
  95. //
  96. // Return Value:
  97. // Any return codes from CWinApp::ExitInstance().
  98. //
  99. //--
  100. /////////////////////////////////////////////////////////////////////////////
  101. int CSmbSmpApp::ExitInstance(void)
  102. {
  103. _Module.Term();
  104. return CWinApp::ExitInstance();
  105. }  //*** CSmbSmpApp::ExitInstance()
  106. /////////////////////////////////////////////////////////////////////////////
  107. //++
  108. //
  109. // FormatError
  110. //
  111. // Routine Description:
  112. // Format an error.
  113. //
  114. // Arguments:
  115. // rstrError [OUT] String in which to return the error message.
  116. // dwError [IN] Error code to format.
  117. //
  118. // Return Value:
  119. // None.
  120. //
  121. //--
  122. /////////////////////////////////////////////////////////////////////////////
  123. void FormatError(CString & rstrError, DWORD dwError)
  124. {
  125. DWORD dwResult;
  126. TCHAR szError[256];
  127. dwResult = ::FormatMessage(
  128. FORMAT_MESSAGE_FROM_SYSTEM,
  129. NULL,
  130. dwError,
  131. MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
  132. szError,
  133. sizeof(szError) / sizeof(TCHAR),
  134. 0
  135. );
  136. if (dwResult == 0)
  137. {
  138. // Format the NT status code from CLUSAPI since some of these haven't
  139. // been integrated into the system yet.
  140. dwResult = ::FormatMessage(
  141. FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
  142. ::GetModuleHandle(_T("CLUSAPI.DLL")),
  143. dwError,
  144. MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
  145. szError,
  146. sizeof(szError) / sizeof(TCHAR),
  147. 0
  148. );
  149. if (dwResult == 0)
  150. {
  151. // Format the NT status code from NTDLL since this hasn't been
  152. // integrated into the system yet.
  153. dwResult = ::FormatMessage(
  154. FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
  155. ::GetModuleHandle(_T("NTDLL.DLL")),
  156. dwError,
  157. MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
  158. szError,
  159. sizeof(szError) / sizeof(TCHAR),
  160. 0
  161. );
  162. }  // if:  error formatting status code from CLUSAPI
  163. }  // if:  error formatting status code from system
  164. if (dwResult != 0)
  165. rstrError = szError;
  166. else
  167. {
  168. dwResult = ::GetLastError();
  169. TRACE(_T("FormatError() - Error 0x%08.8x formatting string for error code 0x%08.8xn"), dwResult, dwError);
  170. rstrError.Format(_T("Error 0x%08.8x"));
  171. }  // else:  error formatting the message
  172. }  //*** FormatError()
  173. /////////////////////////////////////////////////////////////////////////////
  174. // Used to determine whether the DLL can be unloaded by OLE
  175. STDAPI DllCanUnloadNow(void)
  176. {
  177. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  178. return (AfxDllCanUnloadNow() && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
  179. }  //*** DllCanUnloadNow()
  180. /////////////////////////////////////////////////////////////////////////////
  181. // Returns a class factory to create an object of the requested type
  182. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  183. {
  184. return _Module.GetClassObject(rclsid, riid, ppv);
  185. }  //*** DllGetClassObject()
  186. /////////////////////////////////////////////////////////////////////////////
  187. // DllRegisterServer - Adds entries to the system registry
  188. STDAPI DllRegisterServer(void)
  189. {
  190. HRESULT hRes = S_OK;
  191. // registers object, typelib and all interfaces in typelib
  192. hRes = _Module.RegisterServer(FALSE /*bRegTypeLib*/);
  193. return hRes;
  194. }  //*** DllRegisterServer()
  195. /////////////////////////////////////////////////////////////////////////////
  196. // DllUnregisterServer - Removes entries from the system registry
  197. STDAPI DllUnregisterServer(void)
  198. {
  199. HRESULT hRes = S_OK;
  200. _Module.UnregisterServer();
  201. return hRes;
  202. }  //*** DllUnregisterServer()
  203. /////////////////////////////////////////////////////////////////////////////
  204. //++
  205. //
  206. // DllRegisterCluAdminExtension
  207. //
  208. // Routine Description:
  209. // Register the extension with the cluster database.
  210. //
  211. // Arguments:
  212. // hCluster [IN] Handle to the cluster to modify.
  213. //
  214. // Return Value:
  215. // S_OK Extension registered successfully.
  216. // Win32 error code if another failure occurred.
  217. //
  218. //--
  219. /////////////////////////////////////////////////////////////////////////////
  220. STDAPI DllRegisterCluAdminExtension(IN HCLUSTER hCluster)
  221. {
  222. HRESULT hr = S_OK;
  223. LPCWSTR pwszResTypes = g_wszResourceTypeNames;
  224. while (*pwszResTypes != L'')
  225. {
  226. wprintf(L"  %sn", pwszResTypes);
  227. hr = RegisterCluAdminResourceTypeExtension(
  228. hCluster,
  229. pwszResTypes,
  230. &CLSID_CoSmbSmpEx
  231. );
  232. if (hr != S_OK)
  233. break;
  234. pwszResTypes += lstrlenW(pwszResTypes) + 1;
  235. }  // while:  more resource types
  236. return hr;
  237. }  //*** DllRegisterCluAdminExtension()
  238. /////////////////////////////////////////////////////////////////////////////
  239. //++
  240. //
  241. // DllUnregisterCluAdminExtension
  242. //
  243. // Routine Description:
  244. // Unregister the extension with the cluster database.
  245. //
  246. // Arguments:
  247. // hCluster [IN] Handle to the cluster to modify.
  248. //
  249. // Return Value:
  250. // S_OK Extension unregistered successfully.
  251. // Win32 error code if another failure occurred.
  252. //
  253. //--
  254. /////////////////////////////////////////////////////////////////////////////
  255. STDAPI DllUnregisterCluAdminExtension(IN HCLUSTER hCluster)
  256. {
  257. HRESULT hr = S_OK;
  258. LPCWSTR pwszResTypes = g_wszResourceTypeNames;
  259. while (*pwszResTypes != L'')
  260. {
  261. wprintf(L"  %sn", pwszResTypes);
  262. hr = UnregisterCluAdminResourceTypeExtension(
  263. hCluster,
  264. pwszResTypes,
  265. &CLSID_CoSmbSmpEx
  266. );
  267. if (hr != S_OK)
  268. break;
  269. pwszResTypes += lstrlenW(pwszResTypes) + 1;
  270. }  // while:  more resource types
  271. return hr;
  272. }  //*** DllUnregisterCluAdminExtension()