///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1997-1999 Microsoft Corporation // // Module Name: // ClusRes.h // // Description: // Definition of the resource classes for the MSCLUS automation // classes. // // Implementation File: // ClusRes.cpp // // Author: // Charles Stacy Harris (stacyh) 28-Feb-1997 // Galen Barbee (galenb) July 1998 // // Revision History: // July 1998 GalenB Maaaaaajjjjjjjjjoooooorrrr clean up // // Notes: // ///////////////////////////////////////////////////////////////////////////// #ifndef _CLUSRES_H_ #define _CLUSRES_H_ #ifndef __CLUSDISK_H_ #include "ClusDisk.h" #endif // __CLUSDISK_H_ #ifndef _CLUSKEYS_H_ #include "ClusKeys.h" #endif ///////////////////////////////////////////////////////////////////////////// // Forward Class Declarations ///////////////////////////////////////////////////////////////////////////// class CClusResource; class CResources; class CClusResources; class CClusResDepends; class CClusResDependencies; class CClusResDependents; class CClusResGroupResources; class CClusResTypeResources; const IID IID_CClusResource = {0xf2e60801,0x2631,0x11d1,{0x89,0xf1,0x00,0xa0,0xc9,0x0d,0x06,0x1e}}; ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResource // // Description: // Cluster Resource Automation Class. // // Inheritance: // IDispatchImpl< ISClusResource, &IID_ISClusResource, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, // CSupportErrorInfo // CComObjectRootEx< CComSingleThreadModel > // CComCoClass< CClusResource, &CLSID_ClusResource > // CClusterObject // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResource : public IDispatchImpl< ISClusResource, &IID_ISClusResource, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, public CSupportErrorInfo, public CComObjectRootEx< CComSingleThreadModel >, public CComCoClass< CClusResource, &CLSID_ClusResource >, public CClusterObject { typedef CComObjectRootEx< CComSingleThreadModel > BaseComClass; public: CClusResource( void ); ~CClusResource( void ); BEGIN_COM_MAP(CClusResource) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISClusResource) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY_IID(IID_CClusResource, CClusResource) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CClusResource) DECLARE_NO_REGISTRY() private: ISClusRefObject * m_pClusRefObject; HRESOURCE m_hResource; CComObject< CClusProperties > * m_pCommonProperties; CComObject< CClusProperties > * m_pPrivateProperties; CComObject< CClusProperties > * m_pCommonROProperties; CComObject< CClusProperties > * m_pPrivateROProperties; CComBSTR m_bstrResourceName; HRESULT GetProperties( OUT ISClusProperties ** ppProperties, IN BOOL bPrivate, IN BOOL bReadOnly ); DWORD ScGetResourceTypeName( OUT LPWSTR * ppwszResourceTypeName ); protected: virtual DWORD ScWriteProperties( IN const CClusPropList & rcplPropList, IN BOOL bPrivate ); public: HRESULT Create( IN ISClusRefObject * pClusRefObject, IN HGROUP hGroup, IN BSTR bstrResourceName, IN BSTR bstrResourceType, IN long dwFlags ); HRESULT Open( IN ISClusRefObject * pClusRefObject, IN BSTR bstrResourceName ); STDMETHODIMP get_Handle( OUT ULONG_PTR * phandle ); STDMETHODIMP Close( void ); STDMETHODIMP put_Name( IN BSTR bstrResourceName ); STDMETHODIMP get_Name( OUT BSTR * pbstrResourceName ); STDMETHODIMP get_State( IN CLUSTER_RESOURCE_STATE * dwState ); STDMETHODIMP get_CoreFlag( OUT CLUS_FLAGS * dwCoreFlag ); STDMETHODIMP BecomeQuorumResource( IN BSTR bstrDevicePath, IN long lMaxLogSize ); STDMETHODIMP Delete( void ); STDMETHODIMP Fail( void ); STDMETHODIMP Online( IN long nTimeout, OUT VARIANT * pvarPending ); STDMETHODIMP Offline( IN long nTimeout, OUT VARIANT * pvarPending ); STDMETHODIMP ChangeResourceGroup( IN ISClusResGroup * pResourceGroup ); STDMETHODIMP AddResourceNode( IN ISClusNode * pNode ); STDMETHODIMP RemoveResourceNode( IN ISClusNode * pNode ); STDMETHODIMP CanResourceBeDependent( IN ISClusResource * pResource, OUT VARIANT * pvarDependent ); STDMETHODIMP get_Dependencies( OUT ISClusResDependencies ** ppResDependencies ); STDMETHODIMP get_Dependents( OUT ISClusResDependents ** ppResDependents ); STDMETHODIMP get_CommonProperties( OUT ISClusProperties ** ppProperties ); STDMETHODIMP get_PrivateProperties( OUT ISClusProperties ** ppProperties ); STDMETHODIMP get_CommonROProperties( OUT ISClusProperties ** ppProperties ); STDMETHODIMP get_PrivateROProperties( OUT ISClusProperties ** ppProperties ); STDMETHODIMP get_PossibleOwnerNodes( OUT ISClusResPossibleOwnerNodes ** ppOwnerNodes ); STDMETHODIMP get_Group( OUT ISClusResGroup ** ppResGroup ); STDMETHODIMP get_OwnerNode( OUT ISClusNode ** ppNode ); STDMETHODIMP get_Cluster( OUT ISCluster ** ppCluster ); STDMETHODIMP get_ClassInfo( OUT CLUSTER_RESOURCE_CLASS * prclassInfo ); STDMETHODIMP get_Disk( OUT ISClusDisk ** ppDisk ); STDMETHODIMP get_RegistryKeys( OUT ISClusRegistryKeys ** ppRegistryKeys ); STDMETHODIMP get_CryptoKeys( OUT ISClusCryptoKeys ** ppCryptoKeys ); STDMETHODIMP get_TypeName( OUT BSTR * pbstrTypeName ); STDMETHODIMP get_Type( OUT ISClusResType ** ppResourceType ); virtual HRESULT HrLoadProperties( CClusPropList & rcplPropList, BOOL bReadOnly, BOOL bPrivate ); const CComBSTR Name( void ) const { return m_bstrResourceName ; }; }; //*** Class CClusResource ///////////////////////////////////////////////////////////////////////////// //++ // // class CResources // // Description: // Cluster Resource Collection Implementation Base Class. // // Inheritance: // //-- ///////////////////////////////////////////////////////////////////////////// class CResources { public: CResources( void ); ~CResources( void ); HRESULT Create( ISClusRefObject* pClusRefObject ); protected: typedef std::vector< CComObject< CClusResource > * > ResourceList; ResourceList m_Resources; ISClusRefObject * m_pClusRefObject; void Clear( void ); HRESULT FindItem( IN LPWSTR lpszResourceName, OUT UINT * pnIndex ); HRESULT FindItem( IN ISClusResource * pResource, OUT UINT * pnIndex ); HRESULT GetIndex( IN VARIANT varIndex, OUT UINT * pnIndex ); HRESULT GetResourceItem( IN VARIANT varIndex, OUT ISClusResource ** ppResource ); HRESULT RemoveAt( IN size_t pos ); HRESULT DeleteItem( IN VARIANT varIndex ); }; //*** Class CResources ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResources // // Description: // Cluster Resource Collection Automation Class. // // Inheritance: // IDispatchImpl< ISClusResources, &IID_ISClusResources, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, // CSupportErrorInfo // CComObjectRootEx< CComSingleThreadModel > // CResources // CComCoClass< CClusResources, &CLSID_ClusResources > // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResources : public IDispatchImpl< ISClusResources, &IID_ISClusResources, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, public CSupportErrorInfo, public CComObjectRootEx< CComSingleThreadModel >, public CResources, public CComCoClass< CClusResources, &CLSID_ClusResources > { typedef CComObjectRootEx< CComSingleThreadModel > BaseComClass; public: CClusResources( void ); ~CClusResources( void ); BEGIN_COM_MAP(CClusResources) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISClusResources) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CClusResources) DECLARE_NO_REGISTRY() STDMETHODIMP get_Count( OUT long * plCount ); STDMETHODIMP get_Item( IN VARIANT varIndex, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP get__NewEnum( OUT IUnknown ** ppunk ); STDMETHODIMP CreateItem( IN BSTR bstrResourceName, IN BSTR bstrResourceType, IN BSTR bstrGroupName, IN CLUSTER_RESOURCE_CREATE_FLAGS dwFlags, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP DeleteItem( IN VARIANT varIndex ); STDMETHODIMP Refresh( void ); }; //*** Class CClusResources ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResDepends // // Description: // Cluster Resource Collection Automation Base Class. // // Inheritance: // CResources // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResDepends : public CResources { public: CClusResDepends( void ); ~CClusResDepends( void ); HRESULT Create( IN ISClusRefObject * pClusRefObject, IN HRESOURCE hResource ); STDMETHODIMP get_Count( OUT long * plCount ); STDMETHODIMP get_Item( IN VARIANT varIndex, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP get__NewEnum( OUT IUnknown ** ppunk ); STDMETHODIMP DeleteItem( IN VARIANT varIndex ); HRESULT HrRefresh( IN CLUSTER_RESOURCE_ENUM cre ); STDMETHODIMP CreateItem( IN BSTR bstrResourceName, IN BSTR bstrResourceType, IN CLUSTER_RESOURCE_CREATE_FLAGS dwFlags, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP AddItem( IN ISClusResource * pResource ); STDMETHODIMP RemoveItem( IN VARIANT varIndex ); protected: HRESOURCE m_hResource; ///////////////////////////////////////////////////////////////////////////// //++ // // ScAddDependency // // Description: // Abstracts AddClusterResourceDependency() so the arguments can be // swapped as necessary if you are making a depedency or a dependent. // // Arguments: // hRes1 [IN] - The first resource. Could be dependency or // dependent, depending upon the implementation. // hRes2 [IN] - The second resource. Could be dependency or // dependent, depending upon the implementation. // // Return Value: // Win32 status code. // //-- ///////////////////////////////////////////////////////////////////////////// virtual DWORD ScAddDependency( IN HRESOURCE hRes1, IN HRESOURCE hRes2 ) = 0; ///////////////////////////////////////////////////////////////////////////// //++ // // ScRemoveDependency // // Description: // Abstracts RemoveClusterResourceDependency() so the arguments can be // swapped as necessary if you are making a depedency or a dependent. // // Arguments: // hRes1 [IN] - The first resource. Could be dependency or // dependent, depending upon the implementation. // hRes2 [IN] - The second resource. Could be dependency or // dependent, depending upon the implementation. // // Return Value: // Win32 status code. // //-- ///////////////////////////////////////////////////////////////////////////// virtual DWORD ScRemoveDependency( IN HRESOURCE hRes1, IN HRESOURCE hRes2 ) = 0; }; //*** Class CClusResDepends ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResDependencies // // Description: // Cluster Resource Collection Automation Class. // // Inheritance: // IDispatchImpl< ISClusResDependencies, &IID_ISClusResDependencies, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, // CSupportErrorInfo // CComObjectRootEx< CComSingleThreadModel > // CComCoClass< CClusResDependencies, &CLSID_ClusResDependencies > // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResDependencies : public CClusResDepends, public IDispatchImpl< ISClusResDependencies, &IID_ISClusResDependencies, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, public CSupportErrorInfo, public CComObjectRootEx< CComSingleThreadModel >, public CComCoClass< CClusResDependencies, &CLSID_ClusResDependencies > { typedef CComObjectRootEx< CComSingleThreadModel > BaseComClass; public: CClusResDependencies( void ); BEGIN_COM_MAP(CClusResDependencies) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISClusResDependencies) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CClusResDependencies) DECLARE_NO_REGISTRY() HRESULT Create( IN ISClusRefObject * pClusRefObject, IN HRESOURCE hResource ) { return CClusResDepends::Create( pClusRefObject, hResource ); }; STDMETHODIMP get_Count( OUT long * plCount ) { return CClusResDepends::get_Count( plCount ); }; STDMETHODIMP get_Item( IN VARIANT varIndex, OUT ISClusResource ** ppClusterResource ) { return CClusResDepends::get_Item( varIndex, ppClusterResource ); }; STDMETHODIMP get__NewEnum( OUT IUnknown ** ppunk ) { return CClusResDepends::get__NewEnum( ppunk ); }; STDMETHODIMP DeleteItem( IN VARIANT varIndex ) { return CClusResDepends::DeleteItem( varIndex ); }; STDMETHODIMP CreateItem( IN BSTR bstrResourceName, IN BSTR bstrResourceType, IN CLUSTER_RESOURCE_CREATE_FLAGS dwFlags, OUT ISClusResource ** ppClusterResource ) { return CClusResDepends::CreateItem( bstrResourceName, bstrResourceType, dwFlags, ppClusterResource ); }; STDMETHODIMP AddItem( IN ISClusResource * pResource ) { return CClusResDepends::AddItem( pResource ); }; STDMETHODIMP RemoveItem( IN VARIANT varIndex ) { return CClusResDepends::RemoveItem( varIndex ); }; STDMETHODIMP Refresh( void ) { return HrRefresh( CLUSTER_RESOURCE_ENUM_DEPENDS ); }; protected: ///////////////////////////////////////////////////////////////////////////// //++ // // ScAddDependency // // Description: // Abstracts AddClusterResourceDependency() so the arguments can be // swapped as necessary if you are making a depedency or a dependent. // // Arguments: // hRes1 [IN] - The dependent resource // hRes2 [IN] - The depends on resource // // Return Value: // Win32 status code. // //-- ///////////////////////////////////////////////////////////////////////////// virtual DWORD ScAddDependency( HRESOURCE hRes1, HRESOURCE hRes2 ) { return ::AddClusterResourceDependency( hRes1, hRes2 ); }; //*** ScAddDependency ///////////////////////////////////////////////////////////////////////////// //++ // // ScRemoveDependency // // Description: // Abstracts RemoveClusterResourceDependency() so the arguments can be // swapped as necessary if you are making a depedency or a dependent. // // Arguments: // hRes1 [IN] - The dependent resource // hRes2 [IN] - The depends on resource // // Return Value: // Win32 status code. // //-- ///////////////////////////////////////////////////////////////////////////// virtual DWORD ScRemoveDependency( HRESOURCE hRes1, HRESOURCE hRes2 ) { return ::RemoveClusterResourceDependency( hRes1, hRes2 ); }; //*** ScRemoveDependency }; //*** Class CClusResDependencies ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResDependents // // Description: // Cluster Resource Collection Automation Class. // // Inheritance: // IDispatchImpl< ISClusResDependents, &IID_ISClusResDependents, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, // CSupportErrorInfo // CComObjectRootEx< CComSingleThreadModel > // CComCoClass< CClusResDependents, &CLSID_ClusResDependents > // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResDependents : public CClusResDepends, public IDispatchImpl< ISClusResDependents, &IID_ISClusResDependents, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, public CSupportErrorInfo, public CComObjectRootEx< CComSingleThreadModel >, public CComCoClass< CClusResDependents, &CLSID_ClusResDependents > { typedef CComObjectRootEx< CComSingleThreadModel > BaseComClass; public: CClusResDependents( void ); BEGIN_COM_MAP(CClusResDependents) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISClusResDependents) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CClusResDependents) DECLARE_NO_REGISTRY() HRESULT Create( IN ISClusRefObject * pClusRefObject, IN HRESOURCE hResource ) { return CClusResDepends::Create( pClusRefObject, hResource ); }; STDMETHODIMP get_Count( OUT long * plCount ) { return CClusResDepends::get_Count( plCount ); }; STDMETHODIMP get_Item( IN VARIANT varIndex, OUT ISClusResource ** ppClusterResource ) { return CClusResDepends::get_Item( varIndex, ppClusterResource ); }; STDMETHODIMP get__NewEnum( OUT IUnknown ** ppunk ) { return CClusResDepends::get__NewEnum( ppunk ); }; STDMETHODIMP DeleteItem( IN VARIANT varIndex ) { return CClusResDepends::DeleteItem( varIndex ); }; STDMETHODIMP CreateItem( IN BSTR bstrResourceName, IN BSTR bstrResourceType, IN CLUSTER_RESOURCE_CREATE_FLAGS dwFlags, OUT ISClusResource ** ppClusterResource ) { return CClusResDepends::CreateItem( bstrResourceName, bstrResourceType, dwFlags, ppClusterResource ); }; STDMETHODIMP AddItem( IN ISClusResource * pResource ) { return CClusResDepends::AddItem( pResource ); }; STDMETHODIMP RemoveItem( IN VARIANT varIndex ) { return CClusResDepends::RemoveItem( varIndex ); }; STDMETHODIMP Refresh( void ) { return HrRefresh( CLUSTER_RESOURCE_ENUM_PROVIDES ); }; protected: ///////////////////////////////////////////////////////////////////////////// //++ // // ScAddDependency // // Description: // Abstracts AddClusterResourceDependency() so the arguments can be // swapped as necessary if you are making a depedency or a dependent. // // Arguments: // hRes1 [IN] - The depends on resource // hRes2 [IN] - The dependent resource // // Return Value: // Win32 status code. // //-- ///////////////////////////////////////////////////////////////////////////// virtual DWORD ScAddDependency( HRESOURCE hRes1, HRESOURCE hRes2 ) { return ::AddClusterResourceDependency( hRes2, hRes1 ); }; //*** ScAddDependency ///////////////////////////////////////////////////////////////////////////// //++ // // ScRemoveDependency // // Description: // Abstracts RemoveClusterResourceDependency() so the arguments can be // swapped as necessary if you are making a depedency or a dependent. // // Arguments: // hRes1 [IN] - The depends on resource // hRes2 [IN] - The dependent resource // // Return Value: // Win32 status code. // //-- ///////////////////////////////////////////////////////////////////////////// virtual DWORD ScRemoveDependency( HRESOURCE hRes1, HRESOURCE hRes2 ) { return ::RemoveClusterResourceDependency( hRes2, hRes1 ); }; //*** ScRemoveDependency }; //*** Class CClusResDependents ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResGroupResources // // Description: // Cluster Group Resources Collection Automation Class. // // Inheritance: // IDispatchImpl< ISClusResGroupResources, &IID_ISClusResGroupResources, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, // CSupportErrorInfo // CComObjectRootEx< CComSingleThreadModel > // CResources // CComCoClass< CClusResGroupResources, &CLSID_ClusResGroupResources > // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResGroupResources : public IDispatchImpl< ISClusResGroupResources, &IID_ISClusResGroupResources, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, public CSupportErrorInfo, public CComObjectRootEx< CComSingleThreadModel >, public CResources, public CComCoClass< CClusResGroupResources, &CLSID_ClusResGroupResources > { typedef CComObjectRootEx< CComSingleThreadModel > BaseComClass; public: CClusResGroupResources( void ); ~CClusResGroupResources( void ); BEGIN_COM_MAP(CClusResGroupResources) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISClusResGroupResources) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CClusResGroupResources) DECLARE_NO_REGISTRY() HRESULT Create( IN ISClusRefObject * pClusRefObject , IN CRefcountedHGROUP hGroup ); STDMETHODIMP get_Count( OUT long * plCount ); STDMETHODIMP get_Item( IN VARIANT varIndex, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP get__NewEnum( OUT IUnknown ** ppunk ); STDMETHODIMP CreateItem( IN BSTR bstrResourceName, IN BSTR bstrResourceType, IN CLUSTER_RESOURCE_CREATE_FLAGS dwFlags, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP DeleteItem( IN VARIANT varIndex ); STDMETHODIMP Refresh( void ); private: CRefcountedHGROUP m_hGroup; }; //*** Class CClusResGroupResources ///////////////////////////////////////////////////////////////////////////// //++ // // class CClusResTypeResources // // Description: // Cluster Resource Type Resources Collection Automation Class. // // Inheritance: // IDispatchImpl< ISClusResTypeResources, &IID_ISClusResTypeResources, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, // CSupportErrorInfo // CComObjectRootEx< CComSingleThreadModel > // CResources // CComCoClass< CClusResTypeResources, &CLSID_ClusResTypeResources > // //-- ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CClusResTypeResources : public IDispatchImpl< ISClusResTypeResources, &IID_ISClusResTypeResources, &LIBID_MSClusterLib, MAJORINTERFACEVER, MINORINTERFACEVER >, public CSupportErrorInfo, public CComObjectRootEx< CComSingleThreadModel >, public CResources, public CComCoClass< CClusResTypeResources, &CLSID_ClusResTypeResources > { typedef CComObjectRootEx< CComSingleThreadModel > BaseComClass; public: CClusResTypeResources( void ); ~CClusResTypeResources( void ); BEGIN_COM_MAP(CClusResTypeResources) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISClusResTypeResources) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP() DECLARE_NOT_AGGREGATABLE(CClusResTypeResources) DECLARE_NO_REGISTRY() HRESULT Create( IN ISClusRefObject * pClusRefObject, IN BSTR bstrResTypeName ); STDMETHODIMP get_Count( OUT long * plCount ); STDMETHODIMP get_Item( IN VARIANT varIndex, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP get__NewEnum( OUT IUnknown ** ppunk ); STDMETHODIMP CreateItem( IN BSTR bstrResourceName, IN BSTR bstrGroupName, IN CLUSTER_RESOURCE_CREATE_FLAGS dwFlags, OUT ISClusResource ** ppClusterResource ); STDMETHODIMP DeleteItem( IN VARIANT varIndex ); STDMETHODIMP Refresh( void ); private: CComBSTR m_bstrResourceTypeName; }; //*** Class CClusResTypeResources #endif // _CLUSRES_H_