通过WMI 获取 CPU 温度

官方参考文档

WMI C++ Application Examples



// WmiLean.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <conio.h>
#include <comutil.h>
#include <objbase.h>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "comsuppw.lib")

BOOL WMIGetCurrentTemperature(float *pfTemperature)
{
  BOOL bRet = FALSE;

  HRESULT hres = S_OK;
  IWbemServices *pSvc = NULL;
  IWbemLocator *pLoc = NULL;
  IEnumWbemClassObject* pEnumerator = NULL;
  IWbemClassObject *pclsObj = NULL;

  // Step 1: --------------------------------------------------
  // Initialize COM. ------------------------------------------
  CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

  do 
  {  
    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------

    hres =  CoInitializeSecurity(
      NULL, 
      -1,                          // COM authentication
      NULL,                        // Authentication services
      NULL,                        // Reserved
      RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
      RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
      NULL,                        // Authentication info
      EOAC_NONE,                   // Additional capabilities 
      NULL                         // Reserved
      );

    if (FAILED(hres))
    {
      _tprintf(_T("Failed to initialize security. Error code = 0x%08X\n"), hres);
      break;                    // Program has failed.
    }

    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    hres = CoCreateInstance(
      CLSID_WbemLocator,             
      0, 
      CLSCTX_INPROC_SERVER, 
      IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))
    {
      _tprintf( _T("Failed to create IWbemLocator object. Err code = 0x%08X\n"), hres);
      break;                 // Program has failed.
    }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
      _bstr_t(L"ROOT\\WMI"), // Object path of WMI namespace
      NULL,                    // User name. NULL = current user
      NULL,                    // User password. NULL = current
      0,                       // Locale. NULL indicates current
      NULL,                    // Security flags.
      0,                       // Authority (e.g. Kerberos)
      0,                       // Context object 
      &pSvc                    // pointer to IWbemServices proxy
      );

    if (FAILED(hres))
    {
      _tprintf( _T("Could not connect. Error code = 0x%08X\n"), hres);
      break;                // Program has failed.
    }

    //_tprintf( _T("Connected to ROOT\\WMI WMI namespace\n") );


    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        NULL,                        // client identity
        EOAC_NONE                    // proxy capabilities 
      );

    if (FAILED(hres))
    {
      _tprintf( _T("Could not set proxy blanket. Error code = 0x%08X"), hres);
      break;;               // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
    // For example, get the name of the operating system
    hres = pSvc->ExecQuery(
      bstr_t("WQL"), 
      bstr_t("SELECT * FROM MSAcpi_ThermalZoneTemperature"),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
      NULL,
      &pEnumerator);

    if (FAILED(hres))
    {
      _tprintf( _T("Query for MSAcpi_ThermalZoneTemperature failed. Error code = 0x%08X"), hres);
      break;               // Program has failed.
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------    
    ULONG uReturn = 0;

    while (pEnumerator)
    {
      HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
        &pclsObj, &uReturn);

      if(0 == uReturn)
      {
        break;
      }

      VARIANT vtProp;
      VariantInit(&vtProp);

      // Get the value of the Name property
      hr = pclsObj->Get(L"CurrentTemperature", 0, &vtProp, 0, 0);
      if(hr == WBEM_S_NO_ERROR && vtProp.vt != VT_NULL)
      {
        //_tprintf( _T("CurrentTemperature: %u\n"), vtProp.ulVal );
        if(pfTemperature)
        {
          *pfTemperature = (vtProp.ulVal - 3272f)/ 10.0f;
        }
        bRet = 1;
      }

      VariantClear(&vtProp);
    }

  }while(0);

  //Step 8  Cleanup
  // =======
  if(pSvc)
    pSvc->Release();
  if(pLoc)
    pLoc->Release();
  if(pEnumerator)
    pEnumerator->Release();
  if(pclsObj)
    pclsObj->Release();

  CoUninitialize();

  return bRet;
}

int _tmain(int argc, _TCHAR* argv[])
{
  do
  {
    float fTemp = 0;
    if(WMIGetCurrentTemperature(&fTemp))
    {
      printf("temp = %f\n", fTemp);
    }

  }while(! _kbhit() );
  return 0;
}



展开阅读全文

没有更多推荐了,返回首页