|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// Module Name:
// MSClus.cpp
//
// Description:
// Implementation of the DLL Exports for the MSCLUS automation classes.
//
// Author:
// Charles Stacy Harris (stacyh) 28-Feb-1997
// Galen Barbee (galenb) July 1998
//
// Revision History:
// July 1998 GalenB Maaaaaajjjjjjjjjoooooorrrr clean up
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <ShlWapi.h>
#include <atlimpl.cpp>
#include <initguid.h>
#include <ClusRtl.h>
#include "ClusterObject.h"
#include "property.h"
#include "ClusNeti.h"
#include "ClusNetw.h"
#include "ClusRes.h"
#include "ClusRest.h"
#include "ClusResg.h"
#include "ClusNode.h"
#include "Version.h"
#include "ClusApp.h"
#include "Cluster.h"
#define IID_DEFINED
#include "msclus_i.c"
#undef IID_DEFINED
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_ClusApplication, CClusApplication) OBJECT_ENTRY(CLSID_Cluster, CCluster) OBJECT_ENTRY(CLSID_ClusVersion, CClusVersion) OBJECT_ENTRY(CLSID_DomainNames, CDomainNames) OBJECT_ENTRY(CLSID_ClusResGroupPreferredOwnerNodes, CClusResGroupPreferredOwnerNodes) OBJECT_ENTRY(CLSID_ClusterNames, CClusterNames) OBJECT_ENTRY(CLSID_ClusNetInterface, CClusNetInterface) OBJECT_ENTRY(CLSID_ClusNetInterfaces, CClusNetInterfaces) OBJECT_ENTRY(CLSID_ClusNetwork, CClusNetwork) OBJECT_ENTRY(CLSID_ClusNetworks, CClusNetworks) OBJECT_ENTRY(CLSID_ClusNetworkNetInterfaces, CClusNetworkNetInterfaces) OBJECT_ENTRY(CLSID_ClusNode, CClusNode) OBJECT_ENTRY(CLSID_ClusNodes, CClusNodes) OBJECT_ENTRY(CLSID_ClusNodeNetInterfaces, CClusNodeNetInterfaces) OBJECT_ENTRY(CLSID_ClusProperty, CClusProperty) OBJECT_ENTRY(CLSID_ClusProperties, CClusProperties) OBJECT_ENTRY(CLSID_ClusRefObject, CClusRefObject) OBJECT_ENTRY(CLSID_ClusResDependencies, CClusResDependencies) // OBJECT_ENTRY(CLSID_CClusResDependents , CClusResDependents )
OBJECT_ENTRY(CLSID_ClusResGroup, CClusResGroup) OBJECT_ENTRY(CLSID_ClusResGroups, CClusResGroups) OBJECT_ENTRY(CLSID_ClusResource, CClusResource) OBJECT_ENTRY(CLSID_ClusResources, CClusResources) OBJECT_ENTRY(CLSID_ClusResPossibleOwnerNodes, CClusResPossibleOwnerNodes) OBJECT_ENTRY(CLSID_ClusResType, CClusResType) OBJECT_ENTRY(CLSID_ClusResTypes, CClusResTypes) OBJECT_ENTRY(CLSID_ClusResTypeResources, CClusResTypeResources) OBJECT_ENTRY(CLSID_ClusResGroupResources, CClusResGroupResources) #if CLUSAPI_VERSION >= 0x0500
OBJECT_ENTRY(CLSID_ClusResTypePossibleOwnerNodes, CClusResTypePossibleOwnerNodes) #endif // CLUSAPI_VERSION >= 0x0500
OBJECT_ENTRY(CLSID_ClusPropertyValue, CClusPropertyValue) OBJECT_ENTRY(CLSID_ClusPropertyValues, CClusPropertyValues) OBJECT_ENTRY(CLSID_ClusPropertyValueData, CClusPropertyValueData) OBJECT_ENTRY(CLSID_ClusPartition, CClusPartition) OBJECT_ENTRY(CLSID_ClusPartitions, CClusPartitions) OBJECT_ENTRY(CLSID_ClusDisk, CClusDisk) OBJECT_ENTRY(CLSID_ClusDisks, CClusDisks) OBJECT_ENTRY(CLSID_ClusScsiAddress, CClusScsiAddress) OBJECT_ENTRY(CLSID_ClusRegistryKeys, CClusResourceRegistryKeys) #if CLUSAPI_VERSION >= 0x0500
OBJECT_ENTRY(CLSID_ClusCryptoKeys, CClusResourceCryptoKeys) #endif // CLUSAPI_VERSION >= 0x0500
END_OBJECT_MAP()
/////////////////////////////////////////////////////////////////////////////
// Forward function declarations
/////////////////////////////////////////////////////////////////////////////
static void RegisterRegistryCleanUp( void ); static void UnregisterRegistryCleanUp( void );
static const LPWSTR g_ptszRegisterRegistryNodesToDelete[] = { _T( "software\\classes\\MSCluster.Application" ), _T( "software\\classes\\MSCluster.Application.2" ), _T( "software\\classes\\MSCluster.Cluster.2" ), _T( "software\\classes\\MSCluster.ClusGroupResources" ), _T( "software\\classes\\MSCluster.ClusGroupResources.1" ), _T( "software\\classes\\MSCluster.ClusGroupOwners" ), _T( "software\\classes\\MSCluster.ClusGroupOwners.1" ), _T( "software\\classes\\MSCluster.ClusResOwners" ), _T( "software\\classes\\MSCluster.ClusResOwners.1" ), _T( "software\\classes\\CLSID\\{f2e60717-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60718-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\CLSID\\{f2e60719-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e6071a-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e0-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e1-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e3-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e5-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e7-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e9-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606eb-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606ed-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606ef-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f3-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f5-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f7-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f9-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606fb-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606fd-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606fe-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606ff-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60700-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60702-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60704-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\CLSID\\{f2e606f2-2631-11d1-89f1-00a0c90d061e}" ), NULL }; /*
static const LPWSTR g_ptszUnregisterRegistryNodesToDelete[] = { // _T( "software\\classes\\typelib\\{f2e606e0-2631-11d1-89f1-00a0c90d061e}" ),
_T( "software\\classes\\interface\\{f2e606e2-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e4-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e6-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606e8-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606ea-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606ec-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606ee-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f0-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f2-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f4-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f6-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606f8-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606fa-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606fc-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e606fe-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60700-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60702-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60704-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60706-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60708-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e6070a-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e6070c-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e6070e-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60710-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60712-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60714-2631-11d1-89f1-00a0c90d061e}" ), _T( "software\\classes\\interface\\{f2e60716-2631-11d1-89f1-00a0c90d061e}" ), NULL }; */ /////////////////////////////////////////////////////////////////////////////
//++
//
// DllMain
//
// Description:
// DLL Entry Point.
//
// Arguments:
// hInstance [IN] - Out instance handle.
// dwReason [IN] - The reason we are being called.
// lpReserved [IN] - Don't rightly know what this is...
//
// Return Value:
// TRUE if successful, FALSE if not.
//
//--
/////////////////////////////////////////////////////////////////////////////
extern "C" BOOL WINAPI DllMain( IN HINSTANCE hInstance, IN DWORD dwReason, IN LPVOID //lpReserved
) { if ( dwReason == DLL_PROCESS_ATTACH ) { #ifdef _DEBUG
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG ); #endif
_Module.Init( ObjectMap, hInstance ); DisableThreadLibraryCalls( hInstance ); } else if ( dwReason == DLL_PROCESS_DETACH ) { _Module.Term(); }
return TRUE; // ok
} //*** DllMain()
/////////////////////////////////////////////////////////////////////////////
//++
//
// DllCanUnloadNow
//
// Description:
// Used to determine whether the DLL can be unloaded by OLE.
//
// Arguments:
// None.
//
// Return Value:
// S_OK if we can unload, S_FALSE if we cannot.
//
//--
/////////////////////////////////////////////////////////////////////////////
STDAPI DllCanUnloadNow( void ) { return ( _Module.GetLockCount() == 0 ) ? S_OK : S_FALSE;
} //*** DllCanUnloadNow()
/////////////////////////////////////////////////////////////////////////////
//++
//
// DllGetClassObject
//
// Description:
// Retrieves the class object from a DLL object handler or object
// application. DllGetClassObject is called from within the
// CoGetClassObject function when the class context is a DLL.
//
// Arguments:
// rclsid [IN] - CLSID that will associate the correct data and code.
// riid [IN] - Reference to the identifier of the interface that the
// caller is to use to communicate with the class object.
// Usually, this is IID_IClassFactory (defined in the OLE
// headers as the interface identifier for IClassFactory).
// ppv [OUT] - Address of pointer variable that receives the interface
// pointer requested in riid. Upon successful return, *ppv
// contains the requested interface pointer. If an error
// occurs, the interface pointer is NULL.
//
// Return Value:
// S_OK if successful, or CLASS_E_CLASSNOTAVAILABLE if not.
//
//--
/////////////////////////////////////////////////////////////////////////////
STDAPI DllGetClassObject( IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID * ppv ) { return _Module.GetClassObject( rclsid, riid, ppv );
} //*** DllGetClassObject()
/////////////////////////////////////////////////////////////////////////////
//++
//
// DllRegisterServer
//
// Description:
// Add entries to the system registry.
//
// Arguments:
// None.
//
// Return Value:
// S_OK if successful, or other HRESULT error if not.
//
//--
/////////////////////////////////////////////////////////////////////////////
STDAPI DllRegisterServer( void ) { RegisterRegistryCleanUp();
//
// Registers object, typelib and all interfaces in typelib
//
return _Module.RegisterServer( TRUE );
} //*** DllRegisterServer()
/////////////////////////////////////////////////////////////////////////////
//++
//
// DllUnregisterServer
//
// Description:
// Removes entries from the system registry.
//
// Arguments:
// None.
//
// Return Value:
// S_OK if successful, or other HRESULT error if not.
//
//--
/////////////////////////////////////////////////////////////////////////////
STDAPI DllUnregisterServer( void ) { HRESULT _hr = S_FALSE;
UnregisterRegistryCleanUp();
//
// Unregisters object, typelib and all interfaces in typelib
//
_hr = _Module.UnregisterServer(); if ( SUCCEEDED( _hr ) ) {
#if _WIN32_WINNT >= 0x0400
_hr = UnRegisterTypeLib( LIBID_MSClusterLib, 1, 0, LOCALE_NEUTRAL, SYS_WIN32 ); #endif
} //if: server was unregistered
return _hr;
} //*** DllUnregisterServer()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrGetCluster
//
// Description:
// Common implementation of creating a new cluster object.
//
// Arguments:
// ppCluster [OUT] - Catches the newly created object.
// pClusRefObject [IN] - Object that wraps the cluster handle.
//
// Return Value:
// S_OK for success
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT HrGetCluster( OUT ISCluster ** ppCluster, IN ISClusRefObject * pClusRefObject ) { //ASSERT( ppCluster != NULL );
ASSERT( pClusRefObject != NULL );
HRESULT _hr = E_POINTER;
if ( ( ppCluster != NULL ) && ( pClusRefObject != NULL ) ) { HCLUSTER hCluster = NULL;
_hr = pClusRefObject->get_Handle( (ULONG_PTR *) &hCluster ); if ( SUCCEEDED( _hr ) ) { CComObject< CCluster > * pCluster = NULL;
_hr = CComObject< CCluster >::CreateInstance( &pCluster ); if ( SUCCEEDED( _hr ) ) { pCluster->ClusRefObject( pClusRefObject ); pCluster->Hcluster( hCluster );
_hr = pCluster->QueryInterface( IID_ISCluster, (void **) ppCluster ); } } }
return _hr;
} //*** HrGetCluster()
/////////////////////////////////////////////////////////////////////////////
//++
//
// RegisterRegistryCleanUp
//
// Description:
// Clean up the registry during registration
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
static void RegisterRegistryCleanUp( void ) { int nIndex;;
for ( nIndex = 0; ; nIndex++ ) { if ( g_ptszRegisterRegistryNodesToDelete[ nIndex ] == NULL ) { break; } // if:
SHDeleteKey( HKEY_LOCAL_MACHINE, g_ptszRegisterRegistryNodesToDelete[ nIndex ] ); } // for:
} //*** RegisterRegistryCleanUp()
/////////////////////////////////////////////////////////////////////////////
//++
//
// UnregisterRegistryCleanUp
//
// Description:
// Clean up the registry during unregistration
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
static void UnregisterRegistryCleanUp( void ) { return;
} //*** UnregisterRegistryCleanUp()
/////////////////////////////////////////////////////////////////////////////
//++
//
// ClearIDispatchEnum
//
// Description:
// Cleans up an Enum of IDispatch pointers.
//
// Arguments:
// ppVarVect [IN OUT] - The enum to clean up.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void ClearIDispatchEnum( IN OUT CComVariant ** ppvarVect ) { if ( ppvarVect != NULL ) { size_t cCount = ARRAYSIZE( *ppvarVect ); size_t iIndex;
for ( iIndex = 0; iIndex < cCount; iIndex++ ) { (*ppvarVect[iIndex]).pdispVal->Release(); } // for:
delete [] *ppvarVect; *ppvarVect = NULL; }
} //*** ClearIDispatchEnum()
/////////////////////////////////////////////////////////////////////////////
//++
//
// ClearVariantEnum
//
// Description:
// Cleans up an Enum of variant values.
//
// Arguments:
// ppVarVect [IN OUT] - The enum to clean up.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void ClearVariantEnum( IN OUT CComVariant ** ppvarVect ) { if ( ppvarVect != NULL ) { delete [] *ppvarVect; *ppvarVect = NULL; }
} //*** ClearVariantEnum()
|