Holen Sie sich die CPU-Temperatur
Möchte ich, um die CPU-Temperatur.
Unten ist das, was ich getan habe mit C++ und WMI. Ich lese MSAcpi_ThermalZoneTemperature, aber es ist immer das gleiche und es ist nicht die CPU-Temperatur überhaupt.
Gibt es eine Möglichkeit, um die Reale Temperatur der CPU, ohne zu schreiben, Treiber? Oder gibt es irgendwelche Bibliotheken, die ich benutzen kann? Vielen Dank im Voraus.
#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;
}
Wussten Sie, vergleichen Sie Ihre Temperatur mit jedem monitoring-software (superuser.com/a/395437/15484)? Was ist mit Kelvin-Celsius-Umwandlung? (PS: Sie können die Wiederverwendung Treiber von RealTemp oder andere Projekt)
Ich mache die Konvertierung
Haben Sie getroffen, einen Blick auf openhardwaremonitor.org ?
Mögliche Duplikate von Wie man die CPU-Temperatur?
kein Duplikat, denn diese Frage ist definitiv, es zu tun über Windows-API, während die, die Sie link ist, es zu tun via managed code.
Ich mache die Konvertierung
(temp / 10 - 273.15)
aber das Ergebnis ist immer 70.05 und Core Temp zeigt die verschiedenen Temperaturen.Haben Sie getroffen, einen Blick auf openhardwaremonitor.org ?
Mögliche Duplikate von Wie man die CPU-Temperatur?
kein Duplikat, denn diese Frage ist definitiv, es zu tun über Windows-API, während die, die Sie link ist, es zu tun via managed code.
InformationsquelleAutor Johnny Mnemonic | 2014-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
WMI ist die Klasse Win32_TemperatureProbe:
http://msdn.microsoft.com/en-us/library/aa394493%28VS.85%29.aspx
Versuchen Sie es statt MSAcpi_ThermalZoneTemperature
upd.
So, ich habe versucht, den code von MS Beispiel-Seite hier. Es zeigt den Weg zum abrufen von Informationen von WMI-Klassen.
Es ist in der Regel das gleiche wie deins, aber den Namen der Klasse und den Namen der Eigenschaft. So ändern Sie die Zeile
zu
bzw. zum übergeordneten Klasse
dann ändern Sie die Eigenschaft name auf "CurrentReading"
Aber leider den code für das abrufen dieser parameter kann nicht umgesetzt werden, im motherboard-Treiber oder die MS-Treiber. In diesem Fall wird das Ergebnis der VARIANT-Typ auf NULL gesetzt werden.
CurrentReading
Eigenschaft notwendig wäre, für diese WMI-Klasse, um die Arbeit zu tun.Ist, dass die Arbeit für Sie Monster? Es funktioniert nicht für mich und wie computerfreaker sagte, laut der Dokumentation
CurrentReading
ist nicht ausgefüllt.Ja, es funktioniert. Trotzdem, es ist implementiert in der Klasse CIM_TemperatureSensor zu, versuchen Sie es.
Ich bin immer
0x80041010
Fehler, wenn ich rufeIEnumWbemClassObject::Next()
. Hat jemand alle seine Vorschläge arbeiten?InformationsquelleAutor Monster