c++ 获取cpu温度
时间: 2023-09-05 07:09:53 浏览: 40
获取 CPU 温度需要调用操作系统提供的 API,因此在不同的操作系统上实现方式可能不同。以下是在 Windows 系统下使用 WMI 获取 CPU 温度的示例代码:
```c++
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
int main()
{
HRESULT hres;
// 初始化 COM 库
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
std::cerr << "Failed to initialize COM library. Error code: " << hres << std::endl;
return 1;
}
// 设置安全级别
hres = CoInitializeSecurity(
NULL,
-1, // 使用当前登录用户进行身份验证
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL
);
if (FAILED(hres))
{
std::cerr << "Failed to initialize security. Error code: " << hres << std::endl;
CoUninitialize();
return 1;
}
// 获取 WMI 服务
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&pLoc
);
if (FAILED(hres))
{
std::cerr << "Failed to create IWbemLocator object. Error code: " << hres << std::endl;
CoUninitialize();
return 1;
}
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\WMI"), // WMI 名称空间
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc
);
if (FAILED(hres))
{
std::cerr << "Failed to connect to WMI. Error code: " << hres << std::endl;
pLoc->Release();
CoUninitialize();
return 1;
}
// 设置 WMI 查询语句
const wchar_t* wql = L"SELECT * FROM MSAcpi_ThermalZoneTemperature";
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
_bstr_t(L"WQL"),
_bstr_t(wql),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator
);
if (FAILED(hres))
{
std::cerr << "Failed to execute WQL query. Error code: " << hres << std::endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// 获取查询结果
IWbemClassObject* pObj = NULL;
ULONG uReturned = 0;
while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1, &pObj, &uReturned);
if (uReturned == 0)
{
break;
}
VARIANT vtProp;
hres = pObj->Get(L"CurrentTemperature", 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
// 将温度从 K 转换成摄氏度
double temp = vtProp.dblVal - 273.15;
std::cout << "CPU temperature: " << temp << " C" << std::endl;
}
VariantClear(&vtProp);
pObj->Release();
}
// 释放资源
pEnumerator->Release();
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0;
}
```
需要注意的是,该示例代码仅适用于 Windows 系统,并且需要使用管理员权限运行。在 Linux 系统下获取 CPU 温度的方法也不同,可以使用 Linux 操作系统提供的 sysfs 接口或者 lm_sensors 库等。