Win32_AssociatedProcessorMemory - некоторые поля равны NULL
Я пытаюсь использовать класс Win32_AssociatedProcessorMemory, пишу запрос:
Код:
select Dependent from Win32_AssociatedProcessorMemory
и в результате - ничего не получаю, кроме заполненного поля bstrVal
Цитата:
VARIANT типа данных и содержит оно - следующим значением:
\\\\Microsoft-Computer\root\cimv2:Win32_CacheMemory.DeviceID="Cache Memory 0"
\\\\Microsoft-Computer\root\cimv2:Win32_CacheMemory.DeviceID="Cache Memory 0"
Что с ним делать - я привел ниже (данный метод, реализует создание и заполнение данными HashTable), но есть одна большааааая проблема ... :(
Код:
bool TCPUInfo::FillMap( IWbemClassObject *pEnumerator, IWbemServices *pSvc )
{
bool result = false;
SAFEARRAY *psaNames = NULL;
long lLower, lUpper;
HRESULT hRes = pEnumerator->GetNames(
NULL,
WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
NULL,
&psaNames );
if ( !FAILED( hRes ) )
{
SafeArrayGetLBound( psaNames, 1, &lLower );
SafeArrayGetUBound( psaNames, 1, &lUpper );
for ( long i = lLower; i <= lUpper; i++ )
{
BSTR pName = { 0 };
hRes = SafeArrayGetElement( psaNames, &i, &pName );
if ( !FAILED( hRes ) )
{
VARIANT *vrProp = new VARIANT;
memset( vrProp, 0x00, sizeof( VARIANT ) );
hRes = pEnumerator->Get(
pName,
0,
vrProp,
0,
0 );
if ( !FAILED( hRes ) && pSvc == NULL && !( *( Variant* )vrProp ).IsArray() )
m_Map->insert( Context( pName, VarToStr( *( Variant* )vrProp ) ) );
if ( !FAILED( hRes ) && pSvc != NULL )
{
IWbemClassObject *obj = NULL;
hRes = pSvc->GetObject(
VarToStr( *( Variant* )vrProp ).c_str(),
WBEM_FLAG_DIRECT_READ,
NULL,
&obj,
NULL );
if ( !FAILED( hRes ) ) FillMap( obj, NULL );
}
delete vrProp;
vrProp = NULL;
}
}
}
return result;
}
{
bool result = false;
SAFEARRAY *psaNames = NULL;
long lLower, lUpper;
HRESULT hRes = pEnumerator->GetNames(
NULL,
WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
NULL,
&psaNames );
if ( !FAILED( hRes ) )
{
SafeArrayGetLBound( psaNames, 1, &lLower );
SafeArrayGetUBound( psaNames, 1, &lUpper );
for ( long i = lLower; i <= lUpper; i++ )
{
BSTR pName = { 0 };
hRes = SafeArrayGetElement( psaNames, &i, &pName );
if ( !FAILED( hRes ) )
{
VARIANT *vrProp = new VARIANT;
memset( vrProp, 0x00, sizeof( VARIANT ) );
hRes = pEnumerator->Get(
pName,
0,
vrProp,
0,
0 );
if ( !FAILED( hRes ) && pSvc == NULL && !( *( Variant* )vrProp ).IsArray() )
m_Map->insert( Context( pName, VarToStr( *( Variant* )vrProp ) ) );
if ( !FAILED( hRes ) && pSvc != NULL )
{
IWbemClassObject *obj = NULL;
hRes = pSvc->GetObject(
VarToStr( *( Variant* )vrProp ).c_str(),
WBEM_FLAG_DIRECT_READ,
NULL,
&obj,
NULL );
if ( !FAILED( hRes ) ) FillMap( obj, NULL );
}
delete vrProp;
vrProp = NULL;
}
}
}
return result;
}
Некоторые поля (в общем случае - около 50%) получаются со значением NULL ! - что делать, почему не заполняются эти поля ? :eek:
В качестве WMI класса - использую Win32_AssociatedProcessorMemory и как раз в нем, поле BusSpeed - пустое.
Если кто встречался с проблемой - подскажите, как исправить ?
Заранее благодарен.
Найти драйвер предоставляющий WMI требуемую инфорацию...