///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003 // // Module Name: // File Share SampleEx.cpp // // Description: // Implementation of the CFileShareSampleApp class and DLL initialization // routines. // // Author: // () Mmmm DD, 2003 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #pragma warning( push ) #include #include #pragma warning( pop ) #include "File Share SampleEx.h" #include "ExtObj.h" #include "BasePage.h" #include "RegExt.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CComModule _Module; BEGIN_OBJECT_MAP( ObjectMap ) OBJECT_ENTRY( CLSID_CoFileShareSampleEx, CExtObject ) END_OBJECT_MAP() ///////////////////////////////////////////////////////////////////////////// // Global Function Prototypes ///////////////////////////////////////////////////////////////////////////// STDAPI DllCanUnloadNow( void ); STDAPI DllGetClassObject( REFCLSID rclsidIn , REFIID riidIn , LPVOID * ppvOut ); STDAPI DllRegisterServer( void ); STDAPI DllUnregisterServer( void ); STDAPI DllRegisterCluAdminExtension( HCLUSTER hClusterIn ); STDAPI DllUnregisterCluAdminExtension( HCLUSTER hClusterIn ); ///////////////////////////////////////////////////////////////////////////// // class CFileShareSampleApp ///////////////////////////////////////////////////////////////////////////// class CFileShareSampleApp : public CWinApp { public: virtual BOOL InitInstance(); virtual int ExitInstance(); }; //*** class CFileShareSampleApp ///////////////////////////////////////////////////////////////////////////// // The one and only CFileShareSampleApp object CFileShareSampleApp theApp; ///////////////////////////////////////////////////////////////////////////// //++ // // CFileShareSampleApp::InitInstance // // Description: // Initialize this instance of the application. // // Arguments: // None. // // Return Value: // Any return codes from CWinApp::InitInstance(). // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CFileShareSampleApp::InitInstance( void ) { _Module.Init( ObjectMap, m_hInstance ); return CWinApp::InitInstance(); } //*** CFileShareSampleApp::InitInstance ///////////////////////////////////////////////////////////////////////////// //++ // // CFileShareSampleApp::ExitInstance // // Description: // Deinitialize this instance of the application. // // Arguments: // None. // // Return Value: // Any return codes from CWinApp::ExitInstance(). // //-- ///////////////////////////////////////////////////////////////////////////// int CFileShareSampleApp::ExitInstance( void ) { _Module.Term(); return CWinApp::ExitInstance(); } //*** CFileShareSampleApp::ExitInstance ///////////////////////////////////////////////////////////////////////////// //++ // // FormatError // // Description: // Format an error. // // Arguments: // rstrError String in which to return the error message. // dwError Error code to format. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void FormatError( CString & rstrErrorInout , DWORD dwErrorIn ) { DWORD cch; TCHAR szError[ 512 ]; // // 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. // cch = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS , ::GetModuleHandle( _T( "CLUSAPI.DLL" ) ) , dwErrorIn , MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ) , szError , RTL_NUMBER_OF( szError ) , 0 ); if ( cch == 0 ) { cch = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM , NULL , dwErrorIn , MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ) , szError , RTL_NUMBER_OF( szError ) , 0 ); if ( cch == 0 ) { // // Format the NT status code from NTDLL since this hasn't been // integrated into the system yet. // cch = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS , ::GetModuleHandle( _T( "NTDLL.DLL" ) ) , dwErrorIn , MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) , szError , RTL_NUMBER_OF( szError ) , 0 ); } // if: error formatting status code from system } // if: error formatting status code from ClusApi if ( cch > 0 ) { rstrErrorInout = szError; } // if: no error else { TRACE( _T( "FormatError() - Error 0x%08.8x formatting string for error code 0x%08.8x\n" ), GetLastError(), dwErrorIn ); rstrErrorInout.Format( _T( "Error 0x%08.8x" ), dwErrorIn ); } // else: error formatting the message } //*** FormatError ///////////////////////////////////////////////////////////////////////////// //++ // // DllCanUnloadNow // // Description: // Used to determine whether the DLL can be unloaded by COM. // // Arguments: // None. // // Return Value: // S_OK // Dll can be unloaded now. // // S_FALSE // Dll cannot be unloaded now... // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllCanUnloadNow( void ) { AFX_MANAGE_STATE( AfxGetStaticModuleState() ); return ( AfxDllCanUnloadNow() && _Module.GetLockCount() == 0 ) ? S_OK : S_FALSE; } //*** DllCanUnloadNow ///////////////////////////////////////////////////////////////////////////// //++ // // DllGetClassObject // // Description: // Returns a class factory to create an object of the requested type // // Arguments: // rclsidIn - CLSID of the class to create. // riidIn - Requested interface of the class. // ppvOut - Pointer to send the class back to the caller. // // Return Value: // S_OK // Success. // // Other errors as HRESULTs... // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllGetClassObject( REFCLSID rclsidIn , REFIID riidIn , LPVOID * ppvOut ) { return _Module.GetClassObject( rclsidIn, riidIn, ppvOut ); } //*** DllGetClassObject ///////////////////////////////////////////////////////////////////////////// //++ // // DllRegisterServer // // Description: // Perform all relevant COM registration for this component. // // Arguments: // None. // // Return Value: // S_OK // Success. // // Other errors as HRESULTs... // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllRegisterServer( void ) { HRESULT hr = S_OK; // // Registers object, typelib and all interfaces in typelib // hr = _Module.RegisterServer( FALSE /*bRegTypeLib*/ ); return hr; } //*** DllRegisterServer ///////////////////////////////////////////////////////////////////////////// //++ // // DllRegisterServer // // Description: // Perform all relevant COM un-registration for this component. // // Arguments: // None. // // Return Value: // S_OK // Success. // // Other errors as HRESULTs... // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllUnregisterServer( void ) { HRESULT hr = S_OK; hr = _Module.UnregisterServer(); return hr; } //*** DllUnregisterServer ///////////////////////////////////////////////////////////////////////////// //++ // // DllRegisterCluAdminExtension // // Description: // Register the extension with the cluster database. // // Arguments: // hClusterIn Handle to the cluster to modify. // // Return Value: // S_OK Extension registered successfully. // Win32 error code if another failure occurred. // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllRegisterCluAdminExtension( HCLUSTER hClusterIn ) { DWORD sc = ERROR_SUCCESS; DWORD scTemp = ERROR_SUCCESS; LPCWSTR pwszResTypes = g_wszResourceTypeNames; AFX_MANAGE_STATE( AfxGetStaticModuleState() ); // // Register to extend our resource type(s). // while ( *pwszResTypes != L'\0' ) { wprintf( L" %s\n", pwszResTypes ); scTemp = RegisterCluAdminResourceTypeExtension( hClusterIn , pwszResTypes , &CLSID_CoFileShareSampleEx ); if ( scTemp != ERROR_SUCCESS ) { sc = scTemp; } // if: error registering the extension pwszResTypes += lstrlenW( pwszResTypes ) + 1; } // while: more resource types if ( sc != ERROR_SUCCESS ) { goto Cleanup; } // if: Cleanup: return HRESULT_FROM_WIN32( sc ); } //*** DllRegisterCluAdminExtension ///////////////////////////////////////////////////////////////////////////// //++ // // DllUnregisterCluAdminExtension // // Description: // Unregister the extension with the cluster database. // // Arguments: // hClusterIn Handle to the cluster to modify. // // Return Value: // S_OK Extension unregistered successfully. // Win32 error code if another failure occurred. // //-- ///////////////////////////////////////////////////////////////////////////// STDAPI DllUnregisterCluAdminExtension( HCLUSTER hClusterIn ) { DWORD sc = ERROR_SUCCESS; DWORD scTemp = ERROR_SUCCESS; LPCWSTR pwszResTypes = g_wszResourceTypeNames; AFX_MANAGE_STATE( AfxGetStaticModuleState() ); // // Unregister to extend our resource type(s). // while ( *pwszResTypes != L'\0' ) { wprintf( L" %s\n", pwszResTypes ); scTemp = UnregisterCluAdminResourceTypeExtension( hClusterIn , pwszResTypes , &CLSID_CoFileShareSampleEx ); if ( scTemp != ERROR_SUCCESS ) { sc = scTemp; } // if: error unregistering the extension pwszResTypes += lstrlenW( pwszResTypes ) + 1; } // while: more resource types if ( sc != ERROR_SUCCESS ) { goto Cleanup; } // if: Cleanup: return HRESULT_FROM_WIN32( sc ); } //*** DllUnregisterCluAdminExtension