Забитая тема, но все равно я так и не смог найти ответа на вопрос получения показателей с датчиков темпиратуры средствами Windows...
Код ниже взят с msdn с небольшими корректировками, но он явно дает не то что нужно, а именно возвращается константа:
Код:
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
# pragma comment(lib, "wbemuuid.lib")
int main(int argc, char **argv)
{
CoInitializeEx(0, COINIT_MULTITHREADED); // Initialize COM
try
{
HRESULT hres;
hres = CoInitializeSecurity(NULL, -1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
IWbemServices *pSvc = NULL;
// Connect to the root\WMI namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\WMI"),NULL,NULL,0,NULL,0,0,&pSvc);
if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"
<< hex << hres << endl;
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(bstr_t("WQL"),bstr_t("SELECT * FROM MSAcpi_ThermalZoneTemperature"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hres))
{
cout << "Query for operating system name failed."
<< " Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
SAFEARRAY *allNames;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
/*pclsObj->GetNames(NULL,0,NULL,&allNames);
for (LONG a = allNames->rgsabound[0].lLbound; a < allNames->rgsabound[0].lLbound + allNames->rgsabound[0].cElements; a++)
{
BSTR name;
hres = SafeArrayGetElement(allNames, &a, &name);
wcout << name << endl;
}*/
VARIANT vtProp;
VariantInit(&vtProp);
hr = pclsObj->Get(L"CurrentTemperature", 0, &vtProp, 0, 0);
wcout << "Current CPU Temperature : " << (vtProp.intVal - 2732)/10.0 << endl;
VariantClear(&vtProp);
pclsObj->Release();
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
/*pclsObj->Release();*/
}
// In case there was an error, print it out...
catch (_com_error err)
{
printf("Error occurred: %S",err.ErrorMessage());
}
CoUninitialize();
return 0;
}