Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 4694
  • Last Modified:

How can I get CPU temperature in code

Windows Measurements Instrumentation interface contain  a method to get CPU temperature but from what I have read, it is not implemented for most motherboards.

Still, lots of products e.g. Sisoftware,MotherBoard monitor ,PC Wizard 2008 offer this service.  How do they get this data? Is it possible to inquire with the BIOS?  Is it Kernel Mode funcitonality?  

Any input - most welcome
0
yossikally
Asked:
yossikally
  • 3
  • 2
  • 2
  • +2
1 Solution
 
slado2Commented:
Check this article about reading cpu temperature using WMI.
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        Try
 
            Dim searcher As New ManagementObjectSearcher( _
 
                "root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature")
 
 
 
            For Each queryObj As ManagementObject In searcher.Get()
 
                Dim temp As Double = CDbl(queryObj("CurrentTemperature"))
 
                temp = (temp - 2732) / 10.0
 
                MessageBox.Show(temp.ToString)
 
            Next
 
        Catch err As ManagementException
 
            MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
 
        End Try
 
    End Sub
 
End Class

Open in new window

0
 
slado2Commented:
0
 
jkrCommented:
Usually a vendor-specific driver reads that data and reports it, yet the driver interface might not be documented. One common way would be WMI, but that might not always work. Could you try

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
Set wbemObjectSet = objWMIService.ExecQuery ("SELECT * FROM MSAcpi_ThermalZoneTemperature")
For Each wbemObject In wbemObjectSet
       wscript.echo "-----------------------------------"
       wscript.echo "MSAcpi_ThermalZoneTemperature instance"
       wscript.echo "-----------------------------------"
       wscript.echo wbemObject.CurrentTemperature
Next

to see whether that works?
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
yossikallyAuthor Commented:
jkr, is there a C++ version of the aboe code?
0
 
jkrCommented:
Well, sure, but that would be futile unless the VBS thing works...
0
 
jkrCommented:
The C++ version would be

CoInitialize(NULL);
if (CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
return;

IWbemLocator* pIWbemLocator = NULL;
IWbemServices* pWbemServices = NULL;
IEnumWbemClassObject* pEnumObject = NULL;

BSTR bstrNamespace = (L"root\\cimv2");

if (CoCreateInstance (
CLSID_WbemAdministrativeLocator,
NULL ,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
IID_IUnknown ,
( void ** ) & pIWbemLocator) != S_OK)
return;

if (pIWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, NULL, 0,
NULL, NULL,&pWbemServices) != S_OK)
return;

HRESULT hRes;
BSTR strQuery = (L"Select * from MSAcpi_ThermalZoneTemperature");
BSTR strQL = (L"WQL");
hRes = pWbemServices->ExecQuery(strQL, strQuery,
WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumObject);
if (hRes != S_OK)
{
MessageBox("Could not execute Query");
return;
}

hRes = pEnumObject->Reset();
if (hRes != S_OK)
{
MessageBox("Could not Enumerate");
return;
}

ULONG uCount = 1, uReturned;
IWbemClassObject* pClassObject = NULL;
hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
if(hRes != S_OK)
{
MessageBox("Could not Enumerate");
return;
}

VARIANT v;
BSTR strClassProp = SysAllocString(L"CurrentTemperature");
hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
if (hRes != S_OK)
{
MessageBox("Could not Get Value");
return;
}

SysFreeString(strClassProp);
_bstr_t bstrPath = &v; //Just to convert BSTR to ANSI
char* strPath=(char*)bstrPath;

if (SUCCEEDED(hRes))
MessageBox(strPath);
else
MessageBox("Error in getting object");

VariantClear(&v);
pIWbemLocator->Release();
pWbemServices->Release();
pEnumObject->Release();
pClassObject->Release();
CoUninitialize();
0
 
yossikallyAuthor Commented:
This is probably the right solution, the only problem is that I cannot get it to run on my PC/XP, where I keep getting error 0x80041014 after the line
hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
 executes
to which there is no clear cut solution
0
 
primeMover2004Commented:
jkr: did you copy this code from another website?
0

Featured Post

Get free NFR key for Veeam Availability Suite 9.5

Veeam is happy to provide a free NFR license (1 year, 2 sockets) to all certified IT Pros. The license allows for the non-production use of Veeam Availability Suite v9.5 in your home lab, without any feature limitations. It works for both VMware and Hyper-V environments

  • 3
  • 2
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now