获取CPU温度

我想获得CPU温度。 以下是我使用C ++和WMI所做的。 我正在读MSAcpi_ThermalZoneTemperature,但它总是一样的,它根本不是CPU温度。

有没有办法获得CPU的实际温度,而不必写驱动程序? 还是有任何我可以使用的库? 先谢谢你。

#define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") HRESULT GetCpuTemperature(LPLONG pTemperature) { if (pTemperature == NULL) return E_INVALIDARG; *pTemperature = -1; HRESULT ci = CoInitialize(NULL); HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if (SUCCEEDED(hr)) { IWbemLocator *pLocator; 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); 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); } VariantClear(&v); } } } if (ci == S_OK) { CoUninitialize(); } } } return hr; } int main(int argc, char **argv) { LONG temp; GetCpuTemperature(&temp); printf("temp=%lf\n", ((double)temp / 10 - 273.15)); getc(stdin); return 0; } 

WMI具有Win32_TemperatureProbe类:

http://msdn.microsoft.com/en-us/library/aa394493%28VS.85%29.aspx

尝试它而不是MSAcpi_ThermalZoneTemperature

UPD。

所以,我在这里尝试了MS示例页面的代码。 它显示了从WMI类中检索信息的方法。

它通常和你的一样,但是类名和属性名。 所以改变一下

 BSTR query = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature"); 

 BSTR query = SysAllocString(L"SELECT * FROM Win32_TemperatureProbe"); 

或者是它的父类

 BSTR query = SysAllocString(L"SELECT * FROM CIM_TemperatureSensor"); 

然后将属性名称更改为“CurrentReading”

但不幸的是,检索此参数的代码可能不会在主板驱动程序或MS驱动程序中实现。 在这种情况下,VARIANT类型的结果将被设置为NULL。