Entwickler-Ecke
Windows API - Abfrage der CPU ?
Hochhaus - So 29.12.13 18:22
Titel: Abfrage der CPU ?
Hallo allerseits !
da ich mich bei systemnaher Programmierung nicht gut auskenne, habe ich die folgende Frage: Gibt es kurze Delphi-Programme, die als Ausgabe die verwendete CPU und Taktfrequenz liefern ? CPU's unter dem Pentium III müssen natürlich nicht erkannt werden, mich interessieren die Folgenden:
1) Pentium III / 4
2) Core-Prozessoren wie Core 2 Duo oder i3-i7
3) Aktuelle AMD-CPU's
Danke im Voraus für jede Hilfe !
Hochhaus
Dies benötige ich, um in einem Programm festzustellen, ob ein PC gewisse Mindestanforderungen erfüllt.
Google liefert mir ->
http://www.marlem-software.de/marlemprivat/wbboard/thread.php?postid=4959
Das hilft aber nicht weiter ...
Palladin007 - So 29.12.13 18:49
Schau mal nach bei diesem Registry-Pfad nach:
Quelltext
1:
| HKEY_LOCAL_MASHINE\HARDWARE\ |
Zumindest unter WIndows XP findest du dort einige Hardware-Informationen.
Wenn du unter
Quelltext
1:
| HKEY_LOCAL_MASHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\ |
schaust, findest du die einzelnen centralen Prozessor-Kerne. Zumindest glaube ich, dass das die einzelnen Kerne sind, weil an dem einfachen Rechner, an dem ich gerade bin, hab ich nur den Unterordner '0', wa vermutlich den kleinen Ein-Kern-Prozessor meint.
Auf jeden Fall findest du da die wichtigsten Informationen. Tiefer ins Detail geht über den Weg nicht, aber bevor du jetzt anfängst, die komplette Hardware des Rechners auszulesen und zu analysieren, sollte das ausreichen :D
PS:
Das hab ich nicht aus meinem Gedächtnis gekramt, sondern mit Hilfe von Google innerhalb weniger Sekunden gefunden :P
Ein kurzer Blick an den gefundenen Registry-Pfad hat mir dann alles Weitere gesagt ^^
Ich kenne noch einen anderen Weg, den müsste ich aber auch erst suchen und der war in C#, für dich also wahrscheinilch nutzlos.
Edit:
Hab nochwas gefunden:
http://www.mycsharp.de/wbb2/thread.php?threadid=49582
Ähnlich wie die C#-Lösung, die ich mal hatte, aber ich denke, der Weg, der dort beschrieben ist, funktioniert auch unter Delphi.
Im Prinzip wird ja nur eine Select-Abfrage an die Datenbank "Win32_OperatingSystem" gesendet und die Ergebnisse ausgewertet.
Wie du das unter Delhi machst, kann ich dir nicht sagen, ich bin nur ein kleiner C#-Knecht ^^
Hab sowas ähnliches mal gemacht um Informationen über bereits installierte Software zu erhalten und hab das Maimum an möglichen Informationen bekommen, was auch ein bisschen gedauert hat. Am Arbeits-Rechner hat das rund ne Minute gedauert, an meinem privaten Rechner "nur" 8 Sekunden. Ob das an der Tatsache liegt, dass in der Regel zu SOftware installiert ist und ob das in deinem Fall dann schneller geht, musst du aus testen.
Noch ein Edit:
Unter WIndows XP gibt es ein Tool, das nennt sich "command.com"
Einfach über die cmd.exe öffnen, für das Fenster in der Höhe den Buffer deutlich größer einstellen und dann "Systeminfo" eingeben.
Warum den Buffer größer stellen: Bei mir sind 600 Hotfixes installiert und jeder bekommt ne eigene Zeile. ^^
jaenicke - So 29.12.13 19:23
Das Problem an der Sache ist, dass eine aktuelle CPU keine besonders hohe Taktfrequenz haben muss, vor allem in Laptops. Ein reiner Test darauf hilft also nicht viel.
Du könntest einen Hinweis über das Windows System Assessment Tool bekommen. Die winsat.exe mit Parameter "disk" bzw. "cpu -compression" liefert ganz gute Anhaltspunkte.
Ansonsten ist die schon erwähnte WMI eine gute Anlaufstelle.
Palladin007 - So 29.12.13 19:38
Oder er fragt einfach den Prozessor ab und "schätzt" dann anhand der Serie und des Modells (nennt man das so? Ich meine z.B. i7-4771) ob die Leistung ausreicht.
Ich würde dann aber auch maximal nur eine Warnung ausgeben, dass es dann eventuell nicht funktioniert.
Besser finde ich, wenn du die benötigte Hardware einfach nur dazu schreibst und im Programm gar nicht beachtest, zumindest hab ich bisher kaum Programme gesehen, die das selber tun.
Was mir so spontan noch einfällt, wäre Skyrim, das über ein extra Tool die Infos ausgelesen und die EInstellungen dann automatisch konfiguriert hat, aber das war dann ein extra Tool und nicht das eigentliche Programm.
So am Rande:
Gibt es eigentlich online eine Tabelle von Prozesoren mit den jeweiligen Hardware-Spezifikationen, die man einfach automatisch abrufen kann? So aus dem HTML-Quelltext der Webseite von zum Beispiel Intel das raus zu wühlen, wäre mir zu umständlich und fehleranfällig.
Also im Prinzip eine Datenbank, wo man das automatisch abfragen lassen kann, was man so an Infos zum vorhandenen Prozessor benötigt.
Hochhaus - So 29.12.13 19:44
Leider nicht ! Ich kann mit C/C++/C# etc. nicht viel anfangen ...
jaenicke - So 29.12.13 20:34
Hochhaus hat folgendes geschrieben : |
Leider nicht ! Ich kann mit C/C++/C# etc. nicht viel anfangen ... |
Das ist doch in Delphi der selbe API Aufruf. Nur die Syntax ist eben etwas anders.
mandras - So 29.12.13 21:30
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:
| type
TProcessorPowerInformation = packed record Number: cardinal; MaxMhz: cardinal; CurrentMhz: cardinal; MhzLimit: cardinal; MaxIdleState: cardinal; CurrentIdleState: cardinal; end; AProcessorPowerInformation = packed array [word]of TProcessorPowerInformation; PAProcessorPowerInformation = ^AProcessorPowerInformation; function CallNtPowerInformation(InformationLevel: DWORD; InPutBuffer: Pointer; InputBufferSize: ULONG; OutPutBuffer: Pointer; OutPutBufferSize: ULONG): DWORD; stdcall; external 'PowrProf.dll';
procedure TForm1.FormCreate(Sender: TObject); var SI:TSystemInfo; PInfo:PAProcessorPowerInformation; Status: integer; i:integer; begin Memo1.lines.Clear; GetSystemInfo(SI); Memo1.Lines.Add ('Hardware information:'); Memo1.Lines.Add (format ('OEM ID: %u',[SI.dwOEMId])); Memo1.Lines.Add (format ('Number of Processors: %u',[SI.dwNumberOfProcessors])); Memo1.Lines.Add (format ('Page Size: %u',[SI.dwPageSize])); Memo1.Lines.Add (format ('Processor Type: %u',[SI.dwProcessorType])); Memo1.Lines.Add (format ('Minimum application address: %x',[integer(SI.lpMinimumApplicationAddress)])); Memo1.Lines.Add (format ('Maximum application address: %x',[integer(SI.lpMaximumApplicationAddress)])); Memo1.Lines.Add (format ('Active Processor Mask: %u',[SI.dwActiveProcessorMask])); Memo1.Lines.Add (''); Memo1.Lines.Add ('Hardware information:'); getmem (PInfo,SI.dwNumberOfProcessors*sizeof(TProcessorPowerInformation)); Status := CallNTPowerInformation(11, nil, 0, pinfo, sizeof(TProcessorPowerInformation)*SI.dwNumberOfProcessors); for i:=0 to SI.dwNumberOfProcessors-1 do begin Memo1.Lines.Add (format ('Processor Number: %u',[PInfo^[i].Number])); Memo1.Lines.Add (format ('max MHz: %u',[PInfo^[i].MaxMhz])); end;
end; |
Hochhaus - Mo 30.12.13 15:02
Zu Deinem Quelltext finde ich mit Google
//Sorry, kein Delphi
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| typedef struct _SYSTEM_INFO ; }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD_PTR dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision; } SYSTEM_INFO; |
Wo versteckt sich die genauere Prozessorbezeichnung ? dwProcessortype (586) liefert nur eine Prozessorgruppe, nicht aber die genaue Prozessorbezeichnung.
Hochhaus
Hochhaus - Mo 30.12.13 16:24
Das ist ja eine Super-Sammlung an Proggis ! Nach was genau hast Du in Google gesucht ?
Hochhaus - Mo 30.12.13 17:41
Hallo
ich habe den Tipp mit der Registry ausprobiert. Der Pfad ist korrekt. Trotzdem liefert die Funktion
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Function GetProzessorName: String; Var Reg: TRegistry; Begin Result := 'Unbekannter Prozessor'; Reg := TRegistry.Create; Try Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('Hardware\Description\System\CentralProcessor\0', False); Result := Reg.ReadString('ProcessorNameString'); Finally Reg.free; End; End; |
einen leeren String zurück. Das Debuggen zeigt, dass der String leer abgefüllt wird. Ich habe dann mit
RegEdit gesucht, und ... der Eintrag fehlt bei mir ! Weiss jemand Rat ?
Hochhaus
Delete - Mo 30.12.13 17:56
Reg := TRegistry.Create(KEY_READ);
Hochhaus - Mo 30.12.13 18:01
Das war's ! Vielen Dank !
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!