Получение температуры процессора C++ WMI Qt

537
07 сентября 2017, 18:45

На строке hr = pEnum->Next(WBEM_INFINITE, 1, &pObject, &returned); выкидывает ошибку IDispatch error #3587, почему это происходит и как это можно исправить?

Вызов функции: LONG temp; test(&temp); qDebug() << (static_cast<double>(temp) / 10 - 273.15); Выводит 273.25, всегда.

Вот вся функция для получения температуры процессора:

    HRESULT test(LPLONG pTemperature)
{
    if (pTemperature == NULL)
           return E_INVALIDARG;
       *pTemperature = -1;
       HRESULT ci = CoInitialize(NULL); // needs comdef.h
       HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
       qDebug() << hr;
       if ((SUCCEEDED(hr)) || hr == -2147417831)
       {
           IWbemLocator *pLocator; // needs Wbemidl.h & Wbemuuid.lib
           hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLocator);
           if (SUCCEEDED(hr))
           {
               IWbemServices *pServices;
               BSTR ns = SysAllocString(L"root\\WMI");
               hr = pLocator->ConnectServer(ns, NULL, NULL, NULL, 0, NULL, NULL, &pServices);
               pLocator->Release();
               SysFreeString(ns);
               if (SUCCEEDED(hr))
               {
                   BSTR query = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature");
                   BSTR wql = SysAllocString(L"WQL");
                   IEnumWbemClassObject *pEnum;
                   hr = pServices->ExecQuery(wql, query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum);
                   SysFreeString(wql);
                   SysFreeString(query);
                   pServices->Release();
                   if (SUCCEEDED(hr))
                   {
                       IWbemClassObject *pObject;
                       ULONG returned;
                       hr = pEnum->Next(WBEM_INFINITE, 1, &pObject, &returned);
                       _com_error err(hr);
                       LPCTSTR errMsg = err.ErrorMessage();
                       qDebug() << QString::fromStdWString(errMsg);
                       pEnum->Release();
                       if (SUCCEEDED(hr))
                       {
                           BSTR temp = 
                           SysAllocString(L"CurrentTemperature");
                           VARIANT v;
                           VariantInit(&v);
                           hr = pObject->Get(temp, 0, &v, NULL, NULL);
                           pObject->Release();
                           SysFreeString(temp);
                           if (SUCCEEDED(hr))
                           {
                               *pTemperature = V_I4(&v);
                               qDebug() << *pTemperature;
                           }
                           VariantClear(&v);
                       }
                   }
               }
               if (ci == S_OK)
               {
                   CoUninitialize();
               }
           }
       }
       return hr;
}
READ ALSO
C++ Антивирусник не дает скачивать файлы

C++ Антивирусник не дает скачивать файлы

Имеется программа которая просто скачивает файл и записывает на рабочий стол, все хорошо программа скачивает, но вот в чем проблема антивирусник...

390
Что надо чтобы написать функцию прямого обращения к мыше или клавиатуре?

Что надо чтобы написать функцию прямого обращения к мыше или клавиатуре?

Ситуация такая есть у меня библиотека-кликер и я хочу написать несколько функций которые бы работали не через winapi эмулируя клавиатуру, мышь...

313
Узнать наличие текста на изображении

Узнать наличие текста на изображении

Есть массив изображенийНужно выделить изображения содержащие текст

273
Оптимизировать код C++ [требует правки]

Оптимизировать код C++ [требует правки]

Надо оптимизировать код программы как можно сильнее

294