Einzelnen Beitrag anzeigen

Y.Elm

Registriert seit: 19. Sep 2011
Ort: Berlin
21 Beiträge
 
Delphi 2010 Professional
 
#17

AW: Windows 7 Prozessorauslastung auslesen / Lautstärke regeln

  Alt 12. Apr 2012, 09:56
Das Thema ist zwar schon alt, aber ich bin über den selben Fehler gestolpert.
Das Problem ist nicht Windows 7, sondern der neue Prozessor (oder DIE Prozessoren / Prozessorkerne).

Zur Erklärung:
if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION), 0)= NO_ERROR) then "<-- Bei dieser Zeile flieg ich raus" Wenn man die Funktion NTQuerySystemInformation() mit dem Parameter SYS_PERFORMANCE_INFO aufruft, werden die Informationen zu allen Prozessorkernen in den zweiten Parameter (@spi) geschrieben. Wenn man aber als Parameterlänge nur die einfache Größe angibt (sizeof(SYSTEM_PERFORMANCE_INFORMATION) ), dann passen dort auch nur die Informationen zu einem CPU-Kern rein. Als Folge entsteht dieser Fehlercode.

Richtig müsste es also so aussehen:
Delphi-Quellcode:
var
  spi : SYSTEM_PERFORMANCE_INFORMATION;
  sti : SYSTEM_TIME_INFORMATION;
  sbi : SYSTEM_BASIC_INFORMATION;
begin
  result := 0;
  if (NTQuerySystemInformation(SYS_BASIC_INFO, @sbi, sizeof(SYSTEM_BASIC_INFORMATION), 0) = NO_ERROR) then
  begin
    if (NTQuerySystemInformation(SYS_TIME_INFO, @sti, sizeof(SYSTEM_TIME_INFORMATION), 0) = NO_ERROR) then
    if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION) * sbi.bKeNumberProcessors, 0) = NO_ERROR) then
    ...
Leider ist das ganze (wie so oft) nicht gut dokumentiert. Im MSDN-Eintrag zu NtQuerySystemInformation findet man im Abschnitt SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION den Hinweis, dass der Buffer groß genug sein muss, um ein Array von SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION mit der Länge der im System vorhandenen Prozessoren aufzunehmen. Offenbar trifft das auch auf SYSTEM_PERFORMANCE_INFORMATION zu, ist dort aber nicht dokumentiert ...
  Mit Zitat antworten Zitat