////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1999-2000 Microsoft Corporation // // Module Name: // ObjectPath.cpp // // Description: // Implementation of class CObjpath, CProvException, CProvExceptionHr, // and CProvExceptionWin32. // // Author: // Henry Wang (HenryWa) 24-AUG-1999 // ////////////////////////////////////////////////////////////////////////////// #include "Pch.h" #include "ObjectPath.h" //**************************************************************************** // // CObjPath // //**************************************************************************** ////////////////////////////////////////////////////////////////////////////// //++ // // CObjPath::CObjPath( void ) // // Description: // Constructor. // // Arguments: // None. // // Return Values: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CObjPath::CObjPath( void ) : m_parsedObj( NULL ) { } //*** CObjPath::CObjPath() ////////////////////////////////////////////////////////////////////////////// //++ // // CObjPath::~CObjPath( void ) // // Description: // Destructor. // // Arguments: // None. // // Return Values: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CObjPath::~CObjPath( void ) { delete m_parsedObj; } //*** CObjPath::~CObjPath() ////////////////////////////////////////////////////////////////////////////// //++ // // _bstr_t // CObjPath::GetStringValueForProperty( // LPCWSTR pwszIn // ) // // Description: // Retrieve the string value for the given property. // // Arguments: // pwszIn -- Name of the property // // Return Values: // The property's value. // //-- ////////////////////////////////////////////////////////////////////////////// _bstr_t CObjPath::GetStringValueForProperty( LPCWSTR pwszIn ) { int idx; KeyRef * pKey; for( idx = 0 ; idx < m_parsedObj->m_dwNumKeys ; idx++ ) { pKey = m_parsedObj->m_paKeys[ idx ]; if( _wcsicmp( pKey->m_pName, pwszIn ) == 0 ) { if( pKey->m_vValue.vt == VT_BSTR ) { return pKey->m_vValue.bstrVal; } } } return L""; } //*** CObjPath::GetStringValueForProperty() ////////////////////////////////////////////////////////////////////////////// //++ // // _bstr_t // CObjPath::GetClassName( void ) // // Description: // Get the class name. // // Arguments: // None. // // Return Values: // Class name string. // //-- ////////////////////////////////////////////////////////////////////////////// _bstr_t CObjPath::GetClassName( void ) { return m_parsedObj->m_pClass; } //*** CObjPath::GetClassName() ////////////////////////////////////////////////////////////////////////////// //++ // // BOOL // CObjPath::Init( // LPCWSTR pwszPathIn // ) // // Description: // Initialize the object. // // Arguments: // pwszPathIn -- Object path string // // Return Values: // TRUE // FALSE // //-- ////////////////////////////////////////////////////////////////////////////// BOOL CObjPath::Init( LPCWSTR pwszPathIn ) { if ( pwszPathIn == NULL ) { m_parsedObj = new ParsedObjectPath; } else { CObjectPathParser objParser( e_ParserAcceptRelativeNamespace ); objParser.Parse( const_cast< WCHAR * >( pwszPathIn ), &m_parsedObj ); } if ( m_parsedObj == NULL ) { return FALSE; } // if: return TRUE; } //*** CObjPath::Init() ////////////////////////////////////////////////////////////////////////////// //++ // // BOOL // CObjPath::SetClass( // LPCWSTR pwszValueIn // ) // // Description: // Set the name of the class for the object path. // // Arguments: // pwszValueIn -- Class name string. // // Return Values: // TRUE // FALSE // //-- ////////////////////////////////////////////////////////////////////////////// BOOL CObjPath::SetClass( LPCWSTR pwszValueIn ) { return m_parsedObj->SetClassName( pwszValueIn ); } //*** CObjPath::SetClass() ////////////////////////////////////////////////////////////////////////////// //++ // // BOOL // CObjPath::AddProperty( // IN LPCWSTR pwszNameIn, // IN LPCWSTR pwszValueIn // ) // // Description: // Add property to object path. // // Arguments: // pwszNameIn -- Name of the property. // pwszValueIn -- Value of the property in WCHAR* format. // // Return Values: // TRUE // FALSE // //-- ////////////////////////////////////////////////////////////////////////////// BOOL CObjPath::AddProperty( IN LPCWSTR pwszNameIn, IN LPCWSTR pwszValueIn ) { VARIANT v; BOOL bRt = FALSE; VariantInit( & v ); v.vt = VT_BSTR; v.bstrVal = _bstr_t( pwszValueIn ).copy( ); bRt = m_parsedObj->AddKeyRef( pwszNameIn, & v ); VariantClear( & v ); return bRt; } //*** CObjPath::AddProperty() ////////////////////////////////////////////////////////////////////////////// //++ // // _bstr_t // CObjPath::GetObjectPathString( void ) // // Description: // Retrieve object path string. // // Arguments: // None. // // Return Values: // Object path string in _bstr_t. // //-- ////////////////////////////////////////////////////////////////////////////// _bstr_t CObjPath::GetObjectPathString( void ) { LPWSTR pwszPath = NULL; _bstr_t bstrResult; try { CObjectPathParser::Unparse( m_parsedObj, & pwszPath ); bstrResult = pwszPath; } catch( ... ) //catch _com_error { delete [] pwszPath; throw; } delete [] pwszPath; return bstrResult; } //*** CObjPath::GetObjectPathString() ////////////////////////////////////////////////////////////////////////////// //++ // // BOOL // CObjPath::AddProperty( // LPCWSTR pwszNameIn, // VARIANT * pvValueIn // ) // // Description: // Add a property to this instance. // // Arguments: // pwszNameIn -- Name of the property. // pvValueIn -- Value of the property in VARIANT format // // Return Values: // TRUE // FALSE // //-- ////////////////////////////////////////////////////////////////////////////// BOOL CObjPath::AddProperty( LPCWSTR pwszNameIn, VARIANT * pvValueIn ) { return m_parsedObj->AddKeyRef( pwszNameIn, pvValueIn ); } //*** CObjPath::AddProperty //**************************************************************************** // // CProvException // //**************************************************************************** ////////////////////////////////////////////////////////////////////////////// //++ // // LPCWSTR // CProvException::PwszErrorMessage( void ) const // // Description: // retrieve Error message // // Arguments: // None. // // Return Values: // Null-terminated Unicode error message from the exception. // //-- ////////////////////////////////////////////////////////////////////////////// LPCWSTR CProvException::PwszErrorMessage( void ) const { if ( m_bstrError.length( ) == 0 ) { LPWSTR pError = NULL; DWORD rt = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, HRESULT_CODE( m_hr ), MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPWSTR) &pError, 0, NULL ); m_bstrError = pError; LocalFree( pError ); } // if: string is empty return m_bstrError; } //*** CProvException::PwszErrorMessage() //**************************************************************************** // // CWbemClassObject // //**************************************************************************** ////////////////////////////////////////////////////////////////////////////// //++ // // CWbemClassObject::CWbemClassObject( void ) // // Description: // Constructor. // // Arguments: // None. // // Return Values: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CWbemClassObject::CWbemClassObject( void ) : m_pClassObject( NULL ) { VariantInit( &m_v ); } //*** CWbemClassObject::CWbemClassObject() ////////////////////////////////////////////////////////////////////////////// //++ // // CWbemClassObject::CWbemClassObject( // IWbemClassObject * pInstIn // ) // // Description: // Constructor. // // Arguments: // pInstIn -- WMI class object interface. // // Return Values: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CWbemClassObject::CWbemClassObject( IWbemClassObject * pInstIn ) : m_pClassObject( NULL ) { m_pClassObject = pInstIn; if ( m_pClassObject ) { m_pClassObject->AddRef(); } VariantInit( &m_v ); } //*** CWbemClassObject::CWbemClassObject( pInstIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // CWbemClassObject::~CWbemClassObject( void ) // // Description: // Destructor. // // Arguments: // None. // // Return Values: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CWbemClassObject::~CWbemClassObject( void ) { if ( m_pClassObject ) { m_pClassObject->Release(); } VariantClear( &m_v ); } //*** CWbemClassObject::~CWbemClassObject() ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // DWORD dwValueIn, // LPCWSTR pwszPropNameIn // ) // // Description: // Set dword value of a property. // // Arguments: // dwValueIn -- Property dword value // pwszPropNameIn -- Property Name // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( DWORD dwValueIn, LPCWSTR pwszPropNameIn ) { SCODE sc; VariantClear( &m_v ); m_v.vt = VT_I4; m_v.lVal = dwValueIn; sc = m_pClassObject->Put( _bstr_t( pwszPropNameIn ), 0, &m_v, 0 ); if ( FAILED( sc ) ) { throw CProvException( sc ); } return sc; } //*** CWbemClassObject::SetProperty( dwValueIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // LPCWSTR pwszValueIn, // LPCWSTR pwszPropNameIn // ) // // Description: // Set wstring value of a property. // // Arguments: // pwszValueIn -- Property string value. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( LPCWSTR pwszValueIn, LPCWSTR pwszPropNameIn ) { SCODE sc; if ( pwszValueIn == NULL ) { return WBEM_S_NO_ERROR; } VariantClear( &m_v ); // _bstr_t bstrValue( pwszValueIn ); m_v.vt = VT_BSTR; m_v.bstrVal = _bstr_t( pwszValueIn ).copy(); sc = m_pClassObject->Put( _bstr_t( pwszPropNameIn ), 0, &m_v, 0 ); VariantClear( &m_v ); if( FAILED( sc ) ) { throw CProvException( sc ); } return sc; } //*** CWbemClassObject::SetProperty( pwszValueIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // DWORD dwSizeIn, // PBYTE pByteIn, // LPCWSTR pwszPropNameIn // ) // // Description: // Set binary value of a property. // // Arguments: // dwSizeIn -- Size of block pointed by pByteIn. // pByteIn -- Pointer to byte. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( DWORD dwSizeIn, PBYTE pByteIn, LPCWSTR pwszPropNameIn ) { SCODE sc = WBEM_S_NO_ERROR; SAFEARRAY * psa; SAFEARRAYBOUND rgsabound[ 1 ]; LONG idx; LONG ix; rgsabound[ 0 ].lLbound = 0; rgsabound[ 0 ].cElements = dwSizeIn; if( pByteIn == NULL ) { return sc; } VariantClear( &m_v ); psa = SafeArrayCreate( VT_UI1, 1, rgsabound ); if(psa == NULL) { throw WBEM_E_OUT_OF_MEMORY; } for( idx = 0 ; idx < dwSizeIn ; idx++ ) { ix = idx; sc = SafeArrayPutElement( psa, &ix, static_cast< void * >( pByteIn+idx ) ); if ( sc != S_OK ) { throw CProvException( sc ); } } m_v.vt = ( VT_ARRAY | VT_UI1 ); // // no need to clear psa, managed by destructor // m_v.parray = psa; sc = m_pClassObject->Put( _bstr_t( pwszPropNameIn ), 0, &m_v, 0 ); if ( sc != S_OK ) { throw CProvException( sc ); } return sc; } //*** CWbemClassObject::SetProperty( pByteIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // DWORD dwSizeIn, // BSTR * pbstrIn, // LPCWSTR pwszPropNameIn // ) // // Description: // Set wstring array value of a property. // // Arguments: // dwSizeIn -- Size of block pointed by pByteIn. // pbstrIn -- Pointer to BSTR array. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( DWORD dwSizeIn, BSTR * pbstrIn, LPCWSTR pwszPropNameIn ) { SCODE sc = WBEM_S_NO_ERROR; SAFEARRAY * psa; SAFEARRAYBOUND rgsabound[ 1 ]; LONG idx; LONG ix; rgsabound[0].lLbound = 0; rgsabound[0].cElements = dwSizeIn; if ( pbstrIn == NULL ) { return sc; } VariantClear( &m_v ); psa = SafeArrayCreate( VT_BSTR, 1, rgsabound ); if ( psa == NULL ) { throw WBEM_E_OUT_OF_MEMORY; } for( idx = 0 ; idx < dwSizeIn ; idx++) { ix = idx; sc = SafeArrayPutElement( psa, &ix, pbstrIn[ idx ] ); if ( sc != S_OK) { throw CProvException( sc ); } } m_v.vt = (VT_ARRAY | VT_BSTR ); // // no need to clear psa, managed by destructor // m_v.parray = psa; sc = m_pClassObject->Put( _bstr_t( pwszPropNameIn ), 0, &m_v, 0 ); if ( sc != S_OK) { throw CProvException( sc ); } return sc; } //*** CWbemClassObject::SetProperty( pbstrIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // // Description: // Set MultiSz value of a property. // // Arguments: // dwSizeIn -- Size of block pointed by pwszMultiSzIn. // pwszMultiSzIn -- Pointer to MultiSz. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( DWORD dwSizeIn, LPCWSTR pwszMultiSzIn, LPCWSTR pwszPropNameIn ) { SCODE sc = WBEM_S_NO_ERROR; SAFEARRAY * psa; SAFEARRAYBOUND rgsabound[ 1 ]; LPCWSTR pwsz = NULL; LONG idx; LONG ix; if( pwszMultiSzIn == NULL ) { return sc; } VariantClear( &m_v ); // // find out the number of string // DWORD cMultiSz = 1; for ( pwsz = pwszMultiSzIn; *pwsz || *pwsz ++ ; pwsz ++ ) { if ( ! ( *pwsz ) ) { cMultiSz ++ ; } } rgsabound[ 0 ].lLbound = 0; rgsabound[ 0 ].cElements = cMultiSz; psa = SafeArrayCreate( VT_BSTR, 1, rgsabound); if ( psa == NULL ) { throw WBEM_E_OUT_OF_MEMORY; } pwsz = pwszMultiSzIn; for( idx = 0 ; idx < cMultiSz ; idx++ ) { ix = idx; sc = SafeArrayPutElement( psa, &ix, (BSTR) _bstr_t( pwsz ) ); if ( sc != S_OK ) { throw CProvException( sc ); } pwsz = wcschr( pwsz, L'\0' ); pwsz ++; } m_v.vt = (VT_ARRAY | VT_BSTR ); // // no need to clear psa, managed by destructor // m_v.parray = psa; sc = m_pClassObject->Put( _bstr_t( pwszPropNameIn ), 0, &m_v, 0 ); if ( sc != S_OK ) { throw CProvException( sc ); } return sc; } //*** CWbemClassObject::SetProperty( pwszMultiSzIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // LPCSTR pszValueIn, // LPCWSTR pwszPropNameIn // ) // // Description: // Set ansi string value of a property. // // Arguments: // pszValueIn -- Property string value. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( LPCSTR pszValueIn, LPCWSTR pwszPropNameIn ) { if ( pszValueIn == NULL ) { return S_OK; } return SetProperty( static_cast< WCHAR * >( _bstr_t( pszValueIn ) ), pwszPropNameIn ); } //*** CWbemClassObject::SetProperty( pszValueIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SetProperty( // IWbemClassObject * pWbemClassObject, // LPCWSTR pwszPropNameIn // ) // // Description: // Set wbem class object of a property. // // Arguments: // pWbemClassObject -- Property wbem class object // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SetProperty( IWbemClassObject * pWbemClassObjectIn, LPCWSTR pwszPropNameIn ) { SCODE sc = S_OK; if ( pWbemClassObjectIn == NULL ) { return sc; } VariantClear( & m_v ); m_v.vt = VT_UNKNOWN ; m_v.punkVal = pWbemClassObjectIn; pWbemClassObjectIn->AddRef(); sc = m_pClassObject->Put( _bstr_t( pwszPropNameIn ), 0, &m_v, 0 ); VariantClear( &m_v ); if( FAILED( sc ) ) { throw CProvException( sc ); } return sc; } //*** CWbemClassObject::SetProperty( pszValueIn ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SpawnInstance( // LONG lFlagIn, // IWbemClassObject ** ppNewOut // ) // // Description: // Spawn a instance of IWbemClassObject. // // Arguments: // lFlagIn -- WMI flag, reserved, must be 0. // ppNewOut -- Created new instance. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SpawnInstance( LONG lFlagIn, IWbemClassObject ** ppNewOut ) { return m_pClassObject->SpawnInstance( lFlagIn, ppNewOut ); } //*** CWbemClassObject::SpawnInstance() ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::SpawnDerivedClass( // LONG lFlagIn, // IWbemClassObject ** ppNewOut // ) // // Description: // Spawn a derived class. // // Arguments: // lFlagIn -- WMI flag, reserved, must be 0. // ppNewOut -- Created new instance. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::SpawnDerivedClass( LONG lFlagIn, IWbemClassObject ** ppNewOut ) { return m_pClassObject->SpawnDerivedClass( lFlagIn, ppNewOut ); } //*** CWbemClassObject::SpawnInstance() ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetMethod( // BSTR bstrMethodNameIn, // LONG lFlagIn, // IWbemClassObject ** ppINOut, // IWbemClassObject ** ppOUTOut // ) // // Description: // Retrieve the method for an WMI object. // // Arguments: // bstrMethodNameIn // Method Name. // // lFlagIn // WMI flag, Reserved. It must be zero. // // ppINOut // IWbemClassObject pointer which describes the in-parameters // to the method. // // ppOUTOut // an IWbemClassObject pointer which describes the // out-parameters to the method // // Return Values: // WBEM stand error // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetMethod( BSTR bstrMethodNameIn, LONG lFlagIn, IWbemClassObject ** ppINOut, IWbemClassObject ** ppOUTOut ) { return m_pClassObject->GetMethod( bstrMethodNameIn, lFlagIn, ppINOut, ppOUTOut ); } //*** CWbemClassObject::GetMethod() ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // DWORD * pdwValueOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the DWORD property for this WMI object. // // Arguments: // pdwValueOut -- DWORD variable to receive property value. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // WBEM_E_FAILED // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( DWORD * pdwValueOut, LPCWSTR pwszPropNameIn ) { SCODE sc; VariantClear( &m_v ); sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, &m_v, NULL, NULL ); if ( SUCCEEDED( sc ) ) { if( m_v.vt == VT_I4 ) { *pdwValueOut = m_v.lVal; return sc; } else if ( m_v.vt == VT_BOOL) { if ( m_v.boolVal == VARIANT_TRUE ) { *pdwValueOut = 1; } else { *pdwValueOut = 0; } return sc; } else if ( m_v.vt == VT_UI1 ) { *pdwValueOut = ( DWORD ) m_v.bVal; } else if ( m_v.vt == VT_NULL ) { return WBEM_E_FAILED; } } // raise exception if sc is not S_OK or vt is not expected CProvException e( sc ); throw e; return WBEM_E_FAILED; } //*** CWbemClassObject::GetProperty( pdwValueOut ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // _bstr_t & rBstrOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the BSTR property for this WMI object. // // Arguments: // rBstrOut -- bstr_t variable to receive property value. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // WBEM_E_FAILED // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( _bstr_t & rBstrOut, LPCWSTR pwszPropNameIn ) { SCODE sc; VariantClear( &m_v ); sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, &m_v, NULL, NULL ); if ( SUCCEEDED( sc ) ) { if( m_v.vt == VT_BSTR ) { rBstrOut = m_v.bstrVal; return sc; } else if( m_v.vt == VT_NULL ) { return WBEM_E_FAILED; } } CProvException e( sc ); throw e; return WBEM_E_FAILED; } //*** CWbemClassObject::GetProperty( rBstrOut ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // BOOL * pfValueOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the BOOL property for this WMI object. // // Arguments: // pfValueOut -- BOOL variable to receive property value. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // WBEM_E_FAILED // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( BOOL * pfValueOut, LPCWSTR pwszPropNameIn ) { SCODE sc; VariantClear( &m_v ); sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, &m_v, NULL, NULL ); if ( m_v.vt == VT_BOOL ) { *pfValueOut = m_v.boolVal; return sc; } return WBEM_E_FAILED; } //*** CWbemClassObject::GetProperty ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // DWORD * pdwSizeOut, // PBYTE * ppByteOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the binary property for this WMI object. // // Arguments: // pdwSizeOut -- Size of the output buffer. // ppByteOut -- Output buffer. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( DWORD * pdwSizeOut, PBYTE * ppByteOut, LPCWSTR pwszPropNameIn ) { SCODE sc; VariantClear(&m_v); *pdwSizeOut = 0; sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, & m_v, NULL, NULL ); if ( SUCCEEDED ( sc ) ) { if ( m_v.vt == ( VT_ARRAY | VT_UI1 ) ) { PBYTE pByte; * pdwSizeOut = m_v.parray->rgsabound[ 0 ].cElements; * ppByteOut = new BYTE[ *pdwSizeOut ]; sc = SafeArrayAccessData( m_v.parray, ( void ** ) &pByte ); if ( SUCCEEDED ( sc ) ) { UINT idx; for ( idx = 0; idx < *pdwSizeOut; idx ++ ) { *( (* ppByteOut ) + idx ) = *( pByte + idx ); } SafeArrayUnaccessData( m_v.parray ); } } else { throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) ); } } else { throw CProvException( sc ); } return WBEM_S_NO_ERROR; } //*** CWbemClassObject::GetProperty( ppByteOut ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // DWORD * pdwSizeOut, // _bstr_t ** ppbstrOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the BSTR array property for this WMI object. // // Arguments: // pdwSizeOut -- Size of the output buffer. // ppbstrOut -- BSTR variable to receive property value. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( DWORD * pdwSizeOut, _bstr_t ** ppbstrOut, LPCWSTR pwszPropNameIn ) { SCODE sc; VariantClear( &m_v ); *pdwSizeOut = 0; sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, & m_v, NULL, NULL ); if ( SUCCEEDED ( sc ) ) { if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) ) { BSTR * pBstr; *pdwSizeOut = m_v.parray->rgsabound[0].cElements; *ppbstrOut = new _bstr_t[ *pdwSizeOut ]; sc = SafeArrayAccessData( m_v.parray, (void **) & pBstr ); if ( SUCCEEDED ( sc ) ) { UINT idx; for( idx = 0; idx < *pdwSizeOut; idx ++) { *( (*ppbstrOut) + idx ) = *( pBstr + idx ); } SafeArrayUnaccessData( m_v.parray ); } } else { throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) ); } } else { throw CProvException( sc ); } return WBEM_S_NO_ERROR; } //*** CWbemClassObject::GetProperty( ppbstrOut ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // DWORD * pdwSizeOut, // LPWSTR * ppwszMultiSzOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the MultiSz property for this WMI object. // // Arguments: // pdwSizeOut -- Size of the output buffer. // ppwszMultiSzOut -- MultiSz output buffer. // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetPropertyMultiSz( DWORD * pdwSizeOut, LPWSTR * ppwszMultiSzOut, LPCWSTR pwszPropNameIn ) { SCODE sc; DWORD cElements; DWORD cMultiSz = 0; VariantClear(&m_v); *pdwSizeOut = 0; // *ppOut = NULL; sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, & m_v, NULL, NULL ); if ( SUCCEEDED ( sc ) ) { if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) ) { LPWSTR * ppwsz = NULL; cElements = m_v.parray->rgsabound[ 0 ].cElements; sc = SafeArrayAccessData( m_v.parray, ( void ** ) & ppwsz ); if ( SUCCEEDED ( sc ) ) { UINT idx; for( idx = 0; idx < cElements; idx ++) { cMultiSz = cMultiSz + wcslen( *(ppwsz + idx) ) + sizeof (WCHAR); } cMultiSz += sizeof( WCHAR ) * 2; *ppwszMultiSzOut = new WCHAR[ cMultiSz ]; if ( *ppwszMultiSzOut == NULL ) { throw CProvException( static_cast< HRESULT > ( WBEM_E_OUT_OF_MEMORY) ); } LPWSTR pwszDst = *ppwszMultiSzOut; LPWSTR pwszSrc; for ( idx = 0; idx < cElements ; idx ++) { for( pwszSrc = *( ppwsz + idx); *pwszSrc ; pwszDst++, pwszSrc ++ ) { *pwszDst = *pwszSrc; } *(pwszDst++) = L'\0'; } *pwszDst = L'\0'; *pdwSizeOut = cMultiSz; SafeArrayUnaccessData( m_v.parray ); } } else { throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) ); } } else { throw CProvException( sc ); } return WBEM_S_NO_ERROR; } //*** CWbemClassObject::GetProperty( ppwszMultiSzOut ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // VARIANT * pVariantOut, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the variant property for this WMI object. // // Arguments: // pVariantOut -- Variant variable to receive property value // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( VARIANT * pVariantOut, LPCWSTR pwszPropNameIn ) { SCODE sc; sc = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, pVariantOut, NULL, NULL ); if ( FAILED( sc ) ) { CProvException e( sc ); throw e; } return WBEM_S_NO_ERROR; } //*** CWbemClassObject::GetProperty( pVariantOut ) ////////////////////////////////////////////////////////////////////////////// //++ // // SCODE // CWbemClassObject::GetProperty( // CWbemClassObject & rWcoInout, // LPCWSTR pwszPropNameIn // ) // // Description: // Retrieve the embeded object property for this WMI object. // // Arguments: // rWcoInout -- class object variable to receive property value // pwszPropNameIn -- Property Name. // // Return Values: // WBEM_S_NO_ERROR // //-- ////////////////////////////////////////////////////////////////////////////// SCODE CWbemClassObject::GetProperty( CWbemClassObject & rWcoInout, LPCWSTR pwszPropNameIn ) { CError er; VariantClear( &m_v ); er = m_pClassObject->Get( _bstr_t( pwszPropNameIn ), 0, &m_v, NULL, NULL ); if ( m_v.vt != VT_UNKNOWN ) { er = static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER ); } IWbemClassObject * pwco = NULL; er = m_v.punkVal->QueryInterface( & pwco ); rWcoInout = pwco; VariantClear( & m_v ); return WBEM_S_NO_ERROR; } //*** CWbemClassObject::GetProperty( rWcoInout )