Witam,
W sieci znalazłem kod programu, który za pomocą WMI wyświetla nazwę procesora.
Wszystko jest OK gdy przy tworzeniu zapytania do WMI używam Win32_Processor.
HRESULT hRes;
BSTR strQuery = (L"Select * from Win32_Processor");
BSTR strQL = (L"WQL");
hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);
Problem pojawia się gdy chcę przerobić ten kod programu, tak aby wyświetlał jakąś inną informację o komputerze, np. temperaturę procesora. Używam wtedy Win32_TemperatureProbe (zamiast Win32_Processor), a program się wysypuje podczas odczytu temperatury.
Kod programu poniżej:
void CCPU_TemperatureDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
CoInitialize(NULL); //Inicjalizacja bibliotek COM
//Security needs to be initialized in XP first and this was the major problem
//why it was not working in XP.
if(CoInitializeSecurity( NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
0
) != S_OK)
//return;
IWbemLocator * pIWbemLocator = NULL;
IWbemLocator * pIWbemLocator = NULL;
IWbemServices * pWbemServices = NULL;
IEnumWbemClassObject * pEnumObject = NULL;
BSTR bstrNamespace = (L"root\\cimv2");
if(CoCreateInstance (
CLSID_WbemAdministrativeLocator,
NULL ,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
IID_IUnknown ,
( void ** ) & pIWbemLocator
) != S_OK)
return;
if(pIWbemLocator->ConnectServer(
bstrNamespace, // Namespace
NULL, // Userid
NULL, // PW
NULL, // Locale
0, // flags
NULL, // Authority
NULL, // Context
&pWbemServices
) != S_OK)
return;
HRESULT hRes;
//BSTR strQuery = (L"Select * from MSAcpi_ThermalZoneTemperature");
BSTR strQuery = (L"Select * from Win32_TemperatureProbe");
BSTR strQL = (L"WQL");
hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);
if(hRes != S_OK)
{
MessageBox("Could not execute Query");
return;
}
ULONG uCount = 1, uReturned;
IWbemClassObject * pClassObject = NULL;
hRes = pEnumObject->Reset();
if(hRes != S_OK)
{
MessageBox("Could not Enumerate1");
return;
}
hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
if(hRes != S_OK)
{
MessageBox("Could not Enumerate2");
return;
}
VARIANT v;
//BSTR strClassProp = SysAllocString(L"LoadPercentage");
BSTR strClassProp = SysAllocString(L"CurrentReading");
hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
if(hRes != S_OK)
{
MessageBox("Could not Get Value");
return;
}
SysFreeString(strClassProp);
_bstr_t bstrPath = &v; //Just to convert BSTR to ANSI
char* strPath=(char*)bstrPath;
if (SUCCEEDED(hRes))
MessageBox(strPath);
else
MessageBox("Error in getting object");
VariantClear( &v );
pIWbemLocator->Release();
pWbemServices->Release();
pEnumObject->Release();
pClassObject->Release();
CoUninitialize();
}
Proszę o pomoc w rozwiązaniu problemu.
POZDRAWIAM
CurrentReading jest typu sint32, być może to jest problem?
Jeśli tak, to jak zmienić poniższy kod, aby wartość ta wyświetliła się w MessageBox?
VARIANT v;
//BSTR strClassProp = SysAllocString(L"LoadPercentage");
BSTR strClassProp = SysAllocString(L"CurrentReading");
hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
if(hRes != S_OK)
{
MessageBox("Could not Get Value");
return;
}
SysFreeString(strClassProp);
_bstr_t bstrPath = &v; //Just to convert BSTR to ANSI
char* strPath=(char*)bstrPath;
if (SUCCEEDED(hRes))
MessageBox(strPath);
else
MessageBox("Error in getting object");