///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-1997 Microsoft Corporation // // Module Name: // IISClEx4.cpp // // Abstract: // Implementation of the CIISCluExApp class and DLL initialization // routines. // // Author: // David Potter (davidp) June 28, 1996 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "resource.h" #include #include #include "IISClEx4.h" #include "ExtObj.h" #include "RegExt.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define IID_DEFINED #include "ExtObjID_i.c" CComModule _Module; #include BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_CoIISClEx4, CExtObject) END_OBJECT_MAP() ///////////////////////////////////////////////////////////////////////////// // Global Function Prototypes ///////////////////////////////////////////////////////////////////////////// STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID * ppv); STDAPI DllCanUnloadNow(void); STDAPI DllRegisterServer(void); STDAPI DllUnregisterServer(void); HRESULT HrDeleteKey(IN const CString & rstrKey); STDAPI DllGetCluAdminExtensionCaps( OUT DWORD * pdwCaps, OUT CLSID * pclsid, OUT LPWSTR pwszResTypeNames, IN OUT DWORD * pcchResTypeNames ); ///////////////////////////////////////////////////////////////////////////// // class CIISCluExApp ///////////////////////////////////////////////////////////////////////////// class CIISCluExApp : public CWinApp { public: virtual BOOL InitInstance(); virtual int ExitInstance(); private: TCHAR szHelpPath[MAX_PATH+1]; }; CIISCluExApp theApp; BOOL CIISCluExApp::InitInstance() { _Module.Init(ObjectMap, m_hInstance); // // Setup the help file // if (GetWindowsDirectory(szHelpPath, MAX_PATH)) { lstrcat(szHelpPath,_T("\\help\\iishelp\\iis\\winhelp\\iisclex4.hlp")); m_pszHelpFilePath = szHelpPath; } return CWinApp::InitInstance(); } int CIISCluExApp::ExitInstance() { m_pszHelpFilePath = NULL; _Module.Term(); return CWinApp::ExitInstance(); } ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE STDAPI DllCanUnloadNow(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return (AfxDllCanUnloadNow() && _Module.GetLockCount()==0) ? S_OK : S_FALSE; } ///////////////////////////////////////////////////////////////////////////// // Returns a class factory to create an object of the requested type STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); } ///////////////////////////////////////////////////////////////////////////// // DllRegisterServer - Adds entries to the system registry STDAPI DllRegisterServer(void) { HRESULT hRes = S_OK; // registers object, typelib and all interfaces in typelib hRes = _Module.RegisterServer(FALSE /*bRegTypeLib*/); return hRes; } ///////////////////////////////////////////////////////////////////////////// // DllUnregisterServer - Adds entries to the system registry STDAPI DllUnregisterServer(void) { HRESULT hRes = S_OK; _Module.UnregisterServer(); return hRes; } ///////////////////////////////////////////////////////////////////////////// //++ // // FormatError // // Routine Description: // Format an error. // // Arguments: // rstrError [OUT] String in which to return the error message. // dwError [IN] Error code to format. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void FormatError(CString & rstrError, DWORD dwError) { DWORD dwResult; TCHAR szError[256]; dwResult = ::FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), szError, sizeof(szError) / sizeof(TCHAR), 0 ); if (dwResult == 0) { // Format the NT status code from NTDLL since this hasn't been // integrated into the system yet. dwResult = ::FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, ::GetModuleHandle(_T("NTDLL.DLL")), dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), szError, sizeof(szError) / sizeof(TCHAR), 0 ); if (dwResult == 0) { // Format the NT status code from CLUSAPI. This is necessary // for the cases where cluster messages haven't been added to // the system message file yet. dwResult = ::FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, ::GetModuleHandle(_T("CLUSAPI.DLL")), dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), szError, sizeof(szError) / sizeof(TCHAR), 0 ); } // if: error formatting status code from NTDLL } // if: error formatting status code from system if (dwResult != 0) rstrError = szError; else { TRACE(_T("FormatError() - Error 0x%08.8x formatting string for error code 0x%08.8x\n"), dwResult, dwError); rstrError.Format(_T("Error 0x%08.8x")); } // else: error formatting the message } //*** FormatError() ///////////////////////////////////////////////////////////////////////////// //++ // // DllGetCluAdminExtensionCaps // // Routine Description: // Returns the CLSID supported by this extension. // // Arguments: // pdwCaps [OUT] DWORD in which to return extension capabilities. // pclsid [OUT] Place in which to return the CLSID. // pwszResTypeNames [OUT] Buffer in which to return the resource type // names supported by this extension. Each name is // null-terminated. Two nulls follow the last name. // pcchResTypeNames [IN OUT] On input, contains the number of characters // available in the output buffer, including the // null-terminators. On output, contains the // total number of characters written, not // including the null-terminator. // // Return Value: // S_OK Capabilities returned successfully. // E_INVALIDARG Invalid argument specified. // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllGetCluAdminExtensionCaps( OUT DWORD * pdwCaps, OUT CLSID * pclsid, OUT LPWSTR pwszResTypeNames, IN OUT DWORD * pcchResTypeNames ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Validate arguments. if ((pdwCaps == NULL) || (pclsid == NULL) || (pwszResTypeNames == NULL) || (pcchResTypeNames == NULL) || (*pcchResTypeNames < 1) ) return E_INVALIDARG; // Set capabilities flags. *pdwCaps = 0 //| CLUADMEX_CAPS_RESOURCE_PAGES ; // Copy the CLSID to the caller's buffer. CopyMemory(pclsid, &CLSID_CoIISClEx4, sizeof(CLSID)); // Return the resource type names we support. { DWORD cchCopy = min(g_cchResourceTypeNames, *pcchResTypeNames); CopyMemory(pwszResTypeNames, g_wszResourceTypeNames, cchCopy * sizeof(WCHAR)); *pcchResTypeNames = cchCopy; } // Return he resource type names we support return S_OK; } //*** DllGetCluAdminExtensionCaps() ///////////////////////////////////////////////////////////////////////////// //++ // // DllRegisterCluAdminExtension // // Routine Description: // Register the extension with the cluster database. // // Arguments: // hCluster [IN] Handle to the cluster to modify. // // Return Value: // S_OK Extension registered successfully. // Win32 error code if another failure occurred. // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllRegisterCluAdminExtension(IN HCLUSTER hCluster) { HRESULT hr = S_OK; LPCWSTR pwszResTypes = g_wszResourceTypeNames; while (*pwszResTypes != L'\0') { hr = RegisterCluAdminResourceTypeExtension( hCluster, pwszResTypes, &CLSID_CoIISClEx4 ); if (hr != S_OK) break; wprintf(L" %s\n", pwszResTypes); pwszResTypes += lstrlenW(pwszResTypes) + 1; } // while: more resource types return hr; } //*** DllRegisterCluAdminExtension() ///////////////////////////////////////////////////////////////////////////// //++ // // DllUnregisterCluAdminExtension // // Routine Description: // Unregister the extension with the cluster database. // // Arguments: // hCluster [IN] Handle to the cluster to modify. // // Return Value: // S_OK Extension unregistered successfully. // Win32 error code if another failure occurred. // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllUnregisterCluAdminExtension(IN HCLUSTER hCluster) { HRESULT hr = S_OK; LPCWSTR pwszResTypes = g_wszResourceTypeNames; while (*pwszResTypes != L'\0') { wprintf(L" %s\n", pwszResTypes); hr = UnregisterCluAdminResourceTypeExtension( hCluster, pwszResTypes, &CLSID_CoIISClEx4 ); if (hr != S_OK) break; pwszResTypes += lstrlenW(pwszResTypes) + 1; } // while: more resource types return hr; } //*** DllUnregisterCluAdminExtension()