Entwickler-Ecke

Windows API - CPU Temperatur auslesen


LittleBen - So 13.01.13 21:07
Titel: CPU Temperatur auslesen
Guten Abend,
ich weiß, es schwirrt sehr viel über dieses Thema im Internet rum, doch irgendwie komme ich nicht zu einem Ergebnis :(
Habe diesen Code hier gefunden (http://stackoverflow.com/questions/1539604/how-can-i-write-a-delphi-program-to-control-the-cpu-fan-speed-and-monitor-the-te):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
program CPUTemp;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Dialogs,
  ActiveX,
  Variants,
  WbemScripting_TLB;

procedure ShowTemperatureInfo();
var
  WMIServices: ISWbemServices;
  Root       : ISWbemObjectSet;
  Item       : Variant;
  I          : Integer;
begin
 {
 http://msdn.microsoft.com/en-us/library/aa394493%28VS.85%29.aspx
 The Win32_TemperatureProbe  WMI class represents the properties of a temperature sensor (electronic thermometer).
 Most of the information that the Win32_TemperatureProbe WMI class provides comes from SMBIOS.
 Real-time readings for the CurrentReading property cannot be extracted from SMBIOS tables.
 For this reason, current implementations of WMI do not populate the CurrentReading property.
 The CurrentReading property's presence is reserved for future use.
 }


  Writeln('Temperature Info');
  Writeln('----------------');

  WMIServices := CoSWbemLocator.Create.ConnectServer('.''root\cimv2',''''''''0nil);
  Root  := WMIServices.ExecQuery('Select * FROM Win32_TemperatureProbe','WQL'0nil);

  for I := 0 to Root.Count - 1 do
  begin
    Item := Root.ItemIndex(I);
      Writeln('Accuracy                        '+VarToStr(Item.Accuracy));
      Writeln('Availability                    '+VarToStr(Item.Availability));
      Writeln('Caption                         '+Item.Caption);
      Writeln('Config Manager Error Code       '+VarToStr(Item.ConfigManagerErrorCode));
      Writeln('Config Manager User Config      '+VarToStr(Item.ConfigManagerUserConfig));
      Writeln('Creation Class Name             '+VarToStr(Item.CreationClassName));
      Writeln('Current Reading                 '+VarToStr(Item.CurrentReading));
      Writeln('Description                     '+VarToStr(Item.Description));
      Writeln('Device ID                       '+VarToStr(Item.DeviceID));
      Writeln('Error Cleared                   '+VarToStr(Item.ErrorCleared ));
      Writeln('Error Description               '+VarToStr(Item.ErrorDescription));
      Writeln('Install Date                    '+VarToStr(Item.InstallDate));
      Writeln('Is Linear                       '+VarToStr(Item.IsLinear));
      Writeln('Last Error Code                 '+VarToStr(Item.LastErrorCode));
      Writeln('Lower Threshold Critical        '+VarToStr(Item.LowerThresholdCritical));
      Writeln('Lower Threshold Fatal           '+VarToStr(Item.LowerThresholdFatal));
      Writeln('Lower Threshold NonCritical     '+VarToStr(Item.LowerThresholdNonCritical));
      Writeln('Max Readable                    '+VarToStr(Item.MaxReadable));
      Writeln('Min Readable                    '+VarToStr(Item.MinReadable));
      Writeln('Name                            '+VarToStr(Item.Name));
      Writeln('Nominal Reading                 '+VarToStr(Item.NominalReading));
      Writeln('Normal Max                      '+VarToStr(Item.NormalMax));
      Writeln('Normal Min                      '+VarToStr(Item.NormalMin ));
      Writeln('PNP Device ID                   '+VarToStr(Item.PNPDeviceID));
      Writeln('Power Management Capabilities   '+VarToStr(Item.PowerManagementCapabilities));
      Writeln('Power Management Supported      '+VarToStr(Item.PowerManagementSupported));
      Writeln('Resolution                      '+VarToStr(Item.Resolution));
      Writeln('Status                          '+VarToStr(Item.Status));
      Writeln('Status Info                     '+VarToStr(Item.StatusInfo));
      Writeln('System Creation Class Name      '+VarToStr(Item.SystemCreationClassName));
      Writeln('System Name                     '+VarToStr(Item.SystemName));
      Writeln('Tolerance                       '+VarToStr(Item.Tolerance));
      Writeln('Upper Threshold Critical        '+VarToStr(Item.UpperThresholdCritical));
      Writeln('Upper Threshold Fatal           '+VarToStr(Item.UpperThresholdFatal));
      Writeln('Upper Threshold NonCritical     '+VarToStr(Item.UpperThresholdNonCritical));
      Writeln('');
  end;
end;

procedure  ShowCPUFanInfo();
var
  WMIServices: ISWbemServices;
  Root       : ISWbemObjectSet;
  Item       : Variant;
  I          : Integer;
begin
 {
  http://msdn.microsoft.com/en-us/library/aa394146%28VS.85%29.aspx
  The Win32_Fan WMI class represents the properties of a fan device in the computer system. For example, the CPU cooling fan.
 }

  Writeln('CPU FAN Info');
  Writeln('----------------');
  WMIServices := CoSWbemLocator.Create.ConnectServer('.''root\cimv2',''''''''0nil);
  Root  := WMIServices.ExecQuery('Select * FROM Win32_Fan','WQL'0nil);
  for I := 0 to Root.Count - 1 do
  begin
    Item := Root.ItemIndex(I);

    Writeln('ActiveCooling                     '+VarToStr(Item.ActiveCooling));
    Writeln('Availability                      '+VarToStr(Item.Availability));
    Writeln('Caption                           '+VarToStr(Item.Caption));
    Writeln('Config Manager ErrorCode          '+VarToStr(Item.ConfigManagerErrorCode));
    Writeln('Config Manager UserConfig         '+VarToStr(Item.ConfigManagerUserConfig));
    Writeln('Creation ClassName                '+VarToStr(Item.CreationClassName));
    Writeln('Description                       '+VarToStr(Item.Description));
    Writeln('DesiredSpeed                      '+VarToStr(Item.DesiredSpeed));
    Writeln('DeviceID                          '+VarToStr(Item.DeviceID));
    Writeln('ErrorCleared                      '+VarToStr(Item.ErrorCleared));
    Writeln('ErrorDescription                  '+VarToStr(Item.ErrorDescription));
    Writeln('InstallDate                       '+VarToStr(Item.InstallDate));
    Writeln('LastErrorCode                     '+VarToStr(Item.LastErrorCode));
    Writeln('Name                              '+VarToStr(Item.Name));
    Writeln('PNPDeviceID                       '+VarToStr(Item.PNPDeviceID));
    Writeln('PowerManagement Capabilities      '+VarToStr(Item.PowerManagementCapabilities));
    Writeln('PowerManagement Supported         '+VarToStr(Item.PowerManagementSupported));
    Writeln('Status                            '+VarToStr(Item.Status));
    Writeln('StatusInfo                        '+VarToStr(Item.StatusInfo));
    Writeln('SystemCreation ClassName          '+VarToStr(Item.SystemCreationClassName));
    Writeln('SystemName                        '+VarToStr(Item.SystemName));
    Writeln('VariableSpeed                     '+VarToStr(Item.VariableSpeed));
    Writeln('');
  end;

End;

begin
  try
    CoInitialize(nil);
        ShowTemperatureInfo();
        ShowCPUFanInfo();
        Readln;
    CoUninitialize;
  except
    on E:Exception do
    Begin
        CoUninitialize;
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.

Doch das Objekt ISWbemObjectSet hat die Anzahl 0. Von dem her bekomme ich eben keine Daten ^^ Hat jemand eine Ahnung, woran das liegt? Habe ein Mainboard von ASRock.

Viele Grüße
Littleben


jaenicke - So 13.01.13 21:16

Die CPU-Temperatur wurde zwar von Microsoft in WMI angeboten, aber die meisten Hersteller liefern diese nicht dorthin, vermutlich um ihre eigenen Überwachungslösungen zu fördern.

Es gibt Komponenten für Delphi für rund 100 Euro, die die einzelnen Chipsätze der verschiedenen Hersteller entsprechend ansprechen. Selbst so etwas zu implementieren ist vom Aufwand her kaum machbar...

// EDIT:
Ach ja, Tools wie der WMI Explorer helfen dabei zu schauen, ob tatsächlich keine Daten vorhanden sind:
http://www.heise.de/download/wmi-explorer-1169189.html


Delete - So 13.01.13 21:29

Geht bei WMI mit WIN VISTA oder WIN 7 nicht ohne Admin-Rechte.
Programm im Anhang starten mit Als Administrator ausführen.
.
Mit WIN XP:

http://www.entwickler-ecke.de/viewtopic.php?t=75136&highlight=hathor

http://www.entwickler-ecke.de/viewtopic.php?t=40153&highlight=hathor
.
Mit WIN 7 und ältere Versionen:

http://www.entwickler-ecke.de/viewtopic.php?t=83627&highlight=hathor


LittleBen - Fr 18.01.13 16:07

Und wie geht es mit Adminrechte? :P


Blawen - So 20.01.13 02:00

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Und wie geht es mit Adminrechte? :P
z.B. mit der rechten Maustaste (als Admin...) :wink:
Das Auslesen funktioniert bei meinem HP Laptop problemlos.


LittleBen - So 20.01.13 11:45

Troll :P Das meinte ich nicht wirklich ^^
Wenn ich das richtig verstanden habe, dann liefert mir nach der Methode, die user profile iconhathor gepostet hat, CoreTemp die benötigten Daten. Aber wenn ich dafür schon ein Programm schreibe, dann möchte ich ja nicht immer noch ein anderes Programm laufen haben müssen...
Wie liest CoreTemp eigentlich die Daten aus?


Delete - So 20.01.13 15:02

Mit DELPHI allein geht es nicht.
Man muss die CPU-Register auslesen, z.B. MSR 0x19C bei INTEL.
Dafür braucht man winring0.dll, winring0.sys, bzw. WinRing0x64.dll, WinRing0x64.sys.

http://www.alcpu.com/CoreTemp/howitworks.html

Hier ist
http://openhardwaremonitor.org/

Sourcecode in C# - da kannst Du sehen, wie es mit readmsr gemacht wird.
http://code.google.com/p/open-hardware-monitor/source/browse/#svn%2Ftrunk
http://code.google.com/p/open-hardware-monitor/source/browse/trunk/Hardware/CPU/IntelCPU.cs


Blawen - So 20.01.13 17:35

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Troll :P Das meinte ich nicht wirklich ^^

Hatte ich fast vermutet, aber lies mal Deine "Frage"!
Und als Troll bezeichnet zu werden....Danke für die Blumen. :roll:


Bergmann89 - Mo 21.01.13 19:55

Hey,

ich hab das damals über den OpenHardwareMonitor [http://openhardwaremonitor.org/] gemacht, der schreibt seine Daten auch in die WMI. Ist dann zwar ein extra Programm welches immer im Hintergrund läuft, aber so hat man relativ wenig Aufwand. Kann sein das du für den WMI Support den neusten Stand aus'm Repo kompilieren musst. Bei mir war der damals noch nich im Release mit drin.

MfG Bergmann.