📄 wmicode.cpp
字号:
IEnumWbemClassObject *pEnumInst;
ULONG ulCount;
BSTR bstrClass;
BOOL bFound;
HRESULT hr;
hr = 0;
bstrClass = StringToBstr( lpszClass,
-1 );
if ( !bstrClass ) {
PrintError( HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY),
__LINE__,
TEXT(__FILE__),
TEXT("Not enough memory to get a pointer to %s."),
lpszInstance );
return NULL;
}
//
// pInst pointer must be NULL initially,
//
pInst = NULL;
//
// Get Instance Enumerator Interface.
//
pEnumInst = NULL;
hr = pIWbemServices->CreateInstanceEnum(bstrClass,
WBEM_FLAG_SHALLOW |
WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnumInst );
if ( hr == WBEM_S_NO_ERROR ) {
//
// Get a pointer to the instance.
//
// We enumerate all the instances and compare their __RELPATH with
// the specified __RELPATH. If we find a match then, that is the one
// we are looking for.
//
// The other more efficient way is to create a WQL query and execute
// it.
//
hr = WBEM_S_NO_ERROR;
bFound = FALSE;
while ( (hr == WBEM_S_NO_ERROR) && (bFound == FALSE) ) {
hr = pEnumInst->Next( 2000, // two seconds timeout
1, // return just one instance.
&pInst, // pointer to instance.
&ulCount); // Number of instances returned.
if ( ulCount > 0 ) {
bFound = IsInstance( pInst,
lpszInstance );
if ( bFound == FALSE ) {
pInst->Release();
}
}
}
if ( bFound == FALSE )
pInst = NULL;
//
// Done with the instance enumerator.
//
pEnumInst->Release();
}
SysFreeString( bstrClass );
return pInst;
}
//
// Given a pointer, the function returns TRUE if the pointer points to
// the instance specified by lpszInstance.
//
BOOL IsInstance (IWbemClassObject *pInst,
LPTSTR lpszInstance)
{
VARIANT varPropVal;
LPTSTR lpInstance;
BOOL bRet;
bRet = GetPropertyValue( pInst,
TEXT("__RELPATH"),
&varPropVal,
NULL );
if ( bRet == TRUE ) {
lpInstance = BstrToString( V_BSTR(&varPropVal),
-1 );
if ( !lpInstance ) {
PrintError( HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY),
__LINE__,
TEXT(__FILE__),
TEXT("Not enough memory to search for an instance.") );
bRet = FALSE;
}
else {
bRet = _tcsicmp( lpszInstance, lpInstance ) == 0;
SysFreeString( (BSTR)((PVOID)lpInstance) );
}
VariantClear( &varPropVal );
}
return bRet;
}
//
// The function returns property value and its type of a given class/instance.
//
BOOL GetPropertyValue (IWbemClassObject *pRef,
LPTSTR lpszProperty,
VARIANT *pvaPropertyValue,
LPTSTR *lppszPropertyType)
{
IWbemQualifierSet *pQual;
VARIANT vaQual;
BSTR bstrProperty;
HRESULT hr;
BOOL bRet;
//
// Get the property value.
//
bstrProperty = StringToBstr( lpszProperty,
-1 );
if ( !bstrProperty ) {
return FALSE;
}
bRet = FALSE;
if ( lppszPropertyType ) {
//
// Get the textual name of the property type.
//
hr = pRef->GetPropertyQualifierSet( bstrProperty,
&pQual );
if ( hr == WBEM_S_NO_ERROR ) {
//
// Get the textual name of the property type.
//
hr = pQual->Get( L"CIMTYPE",
0,
&vaQual,
NULL );
if ( hr == WBEM_S_NO_ERROR ) {
*lppszPropertyType = BstrToString( V_BSTR(&vaQual),
-1 );
VariantClear( &vaQual );
}
pQual->Release();
}
}
VariantInit( pvaPropertyValue );
hr = pRef->Get( bstrProperty,
0,
pvaPropertyValue,
NULL,
NULL );
if ( hr == WBEM_S_NO_ERROR ) {
bRet = TRUE;
}
else {
if ( lppszPropertyType && *lppszPropertyType ) {
SysFreeString( (BSTR)((PVOID)*lppszPropertyType) );
}
}
SysFreeString( bstrProperty );
return bRet;
}
//
// Given a pointer to an instance, its property and and variant specifying
// the value for the property, the function updates the property and the
// instance.
//
HRESULT UpdatePropertyValue (IWbemServices *pIWbemServices,
IWbemClassObject *pInstance,
LPTSTR lpszProperty,
LPVARIANT pvaNewValue)
{
BSTR bstrProperty;
HRESULT hr;
bstrProperty = StringToBstr( lpszProperty,
-1 );
if ( !bstrProperty ) {
PrintError( HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY),
__LINE__,
TEXT(__FILE__),
TEXT("Not enough memory to update %s."),
lpszProperty );
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
hr = pInstance->Put( bstrProperty,
0,
pvaNewValue,
0 );
if ( hr == WBEM_S_NO_ERROR ) {
hr = pIWbemServices->PutInstance( pInstance,
WBEM_FLAG_UPDATE_ONLY,
NULL,
NULL );
if ( hr != WBEM_S_NO_ERROR ) {
PrintError( hr,
__LINE__,
TEXT(__FILE__),
TEXT("Failed to save the instance,")
TEXT(" %s will not be updated."),
lpszProperty );
}
}
else {
PrintError( hr,
__LINE__,
TEXT(__FILE__),
TEXT("Couldn't update %s."),
lpszProperty );
}
SysFreeString( bstrProperty );
return hr;
}
BSTR StringToBstr (LPTSTR lpSrc,
int nLenSrc)
{
BSTR lpDest;
//
// In case of ANSI version, we need to change the ANSI string to UNICODE since
// BSTRs are essentially UNICODE strings.
//
#if !defined(UNICODE) || !defined(_UNICODE)
int nLenDest;
nLenDest = MultiByteToWideChar( CP_ACP, 0, lpSrc, nLenSrc, NULL, 0);
lpDest = SysAllocStringLen( NULL, nLenDest );
if ( lpDest ) {
MultiByteToWideChar( CP_ACP, 0, lpSrc, nLenSrc, lpDest, nLenDest );
}
//
// In case of UNICODE version, we simply allocate memory and copy the string.
//
#else
if ( lpSrc == NULL ) {
nLenSrc = 0;
}
else {
if ( nLenSrc == -1 ) {
nLenSrc = _tcslen( lpSrc ) + 1;
}
}
lpDest = SysAllocStringLen( lpSrc, nLenSrc );
#endif
return lpDest;
}
//
// The function converts a BSTR string into ANSI and returns it in an allocated
// memory. The memory must be freed by the caller using SysFreeString()
// function. If nLenSrc is -1, the string is null terminated.
//
LPTSTR BstrToString (BSTR lpSrc,
int nLenSrc)
{
LPTSTR lpDest;
//
// In case of ANSI version, we need to change BSTRs which are UNICODE strings
// into ANSI version.
//
#if !defined(UNICODE) || !defined(_UNICODE)
int nLenDest;
nLenDest = WideCharToMultiByte( CP_ACP, 0, lpSrc, nLenSrc, NULL,
0, NULL, NULL );
lpDest = (LPTSTR)SysAllocStringLen( NULL, (size_t)nLenDest );
if ( lpDest ) {
WideCharToMultiByte( CP_ACP, 0, lpSrc, nLenSrc, lpDest,
nLenDest, NULL, NULL );
}
//
// In case of UNICODE version, we simply allocate memory and copy the BSTR
// into allocate memory and return its address.
//
#else
if ( lpSrc ) {
if ( nLenSrc == -1 ) {
nLenSrc = _tcslen( lpSrc ) + 1;
}
}
else {
nLenSrc = 0;
}
lpDest = (LPTSTR)SysAllocStringLen( lpSrc, nLenSrc );
#endif
return lpDest;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -