gpt4 book ai didi

c++ - 获取 CPU 温度

转载 作者:IT老高 更新时间:2023-10-28 13:01:44 30 4
gpt4 key购买 nike

我想获取 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;
}

最佳答案

说实话,这取决于硬件。

适用于大多数硬件的库是 OpenHardwareMonitorLib。不幸的是,它没有文档,实际上并不作为一个独立的软件存在。它是名为“Open Hardware Monitor”的开源软件的一部分。它是在 .NET C Sharp 中完成的,当然,它只适用于 Windows。幸运的是,您可以将其作为 DLL 获取,并且 GUI 与实际后端 OpenHardwareMonitorLib 完全分离。

阅读这篇文章,了解如何在 C++ 中使用它

How to call a C# library from Native C++ (using C++\CLI and IJW)

因此,考虑到它没有文档,使用起来可能有点困难。在阅读了一段时间的源代码后,这是我的看法:

using OpenHardwareMonitor.Hardware;
...
float? cpu_temperature_celcius = null;
Computer computer = new Computer();
computer.CPUEnabled = true;
computer.Open();
foreach (IHardware hardware in computer.Hardware)
if (hardware.HardwareType == HardwareType.CPU)
foreach (ISensor sensor in hardware.Sensors)
if (sensor.SensorType == SensorType.Temperature)
cpu_temperature_celcius = sensor.Value;

此 C# 代码以摄氏度获取 CPU 的温度。在 Intel Haswell CPU 上测试。它很可能适用于 AMD 和 Intel 的大多数其他 CPU。需要 OpenHardwareMonitorLib.dll。您可以从 source 编译它

您可以使用此库获得有关系统的许多其他信息。

请注意,用户的 CPU 可以有多个温度传感器。例如,每个核心都有一个温度传感器,所以不要像我在上面的例子中那样总是选择最后一个。

祝你好运。

关于c++ - 获取 CPU 温度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23314886/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com