21xrx.com
2024-11-08 21:58:04 Friday
登录
文章检索 我的文章 写文章
C++读取BIOS温度值
2023-06-28 16:29:27 深夜i     --     --
C++ BIOS 温度值 读取 笔记本电脑

在计算机硬件监控中,BIOS温度是一个非常重要的指标。为了确保计算机硬件的稳定性和安全性,我们需要经常监控计算机的BIOS温度。在C++语言中,我们可以通过读取BIOS温度值来实现这一目的。

要读取BIOS温度值,我们需要使用C++中的一些系统函数。在Windows操作系统中,我们可以使用WMI(Windows Management Instrumentation)技术来访问BIOS温度值。WMI是一种用于管理Windows系统的技术,它可以提供对各种系统信息的访问,包括BIOS温度值。

在C++中,我们可以通过调用WMI API来实现对BIOS温度值的访问。首先,我们需要创建一个WMI服务管理器对象,然后使用该对象来连接到WMI服务。接下来,我们需要创建一个查询对象和一个枚举器对象,然后使用这些对象来查询BIOS温度值。最后,我们需要解析查询结果并输出BIOS温度值。

下面是一个示例程序,它演示了如何使用C++读取BIOS温度值:


#include <iostream>

#include <Windows.h>

#include <wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

int main()

{

  HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);

  if (FAILED(hr))

  

    std::cout << "CoInitializeEx failed: " << hr << std::endl;

    return 1;

  

  hr = CoInitializeSecurity(NULL, -1, NULL, NULL,

    RPC_C_AUTHN_LEVEL_DEFAULT,

    RPC_C_IMP_LEVEL_IMPERSONATE,

    NULL, EOAC_NONE, NULL);

  if (FAILED(hr))

  {

    std::cout << "CoInitializeSecurity failed: " << hr << std::endl;

    CoUninitialize();

    return 1;

  }

  IWbemLocator* pLoc = NULL;

  hr = CoCreateInstance(

    CLSID_WbemLocator, NULL,

    CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);

  if (FAILED(hr))

  {

    std::cout << "CoCreateInstance failed: " << hr << std::endl;

    CoUninitialize();

    return 1;

  }

  IWbemServices* pSvc = NULL;

  hr = pLoc->ConnectServer(

    _bstr_t(L"ROOT\\WMI"),

    NULL,

    NULL,

    0,

    NULL,

    0,

    0,

    &pSvc);

  if (FAILED(hr))

  {

    std::cout << "ConnectServer failed: " << hr << std::endl;

    pLoc->Release();

    CoUninitialize();

    return 1;

  }

  hr = 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(hr))

  {

    std::cout << "CoSetProxyBlanket failed: " << hr << std::endl;

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return 1;

  }

  IEnumWbemClassObject* pEnumerator = NULL;

  hr = pSvc->ExecQuery(

    _bstr_t("WQL"),

    _bstr_t("SELECT * FROM MSAcpi_ThermalZoneTemperature"),

    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

    NULL,

    &pEnumerator);

  if (FAILED(hr))

  {

    std::cout << "ExecQuery failed: " << hr << std::endl;

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return 1;

  }

  IWbemClassObject* pClsObj = NULL;

  ULONG uReturn = 0;

  hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClsObj, &uReturn);

  if (FAILED(hr))

  {

    std::cout << "Next failed: " << hr << std::endl;

    pEnumerator->Release();

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return 1;

  }

  VARIANT vt;

  hr = pClsObj->Get(L"CurrentTemperature", 0, &vt, NULL, NULL);

  if (FAILED(hr))

  {

    std::cout << "Get CurrentTemperature failed: " << hr << std::endl;

    VariantClear(&vt);

    pClsObj->Release();

    pEnumerator->Release();

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return 1;

  }

  double temp = vt.dblVal / 10.0 - 273.15;

  std::cout << "BIOS temperature: " << temp << " ℃" << std::endl;

  VariantClear(&vt);

  pClsObj->Release();

  pEnumerator->Release();

  pSvc->Release();

  pLoc->Release();

  CoUninitialize();

  return 0;

}

这个示例程序使用了WMI API来读取BIOS温度值,并将得到的温度值转换为摄氏度。该程序可以在Windows操作系统上运行,并正确地输出BIOS温度值。

在实际开发中,我们可以将这个程序嵌入到计算机硬件监控软件中,以实现对BIOS温度的实时监控。这样可以大大提高计算机的稳定性和安全性,避免因过热而导致的硬件损坏和数据丢失。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复