Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   CallNtPowerInformation (https://www.delphipraxis.net/63242-callntpowerinformation.html)

Luckie 15. Feb 2006 20:12


CallNtPowerInformation
 
Ich versuche gerade die Prozessortaktfrequenz mit Hilfe der API Funktion MSDN-Library durchsuchenCallNtPowerInformation zu ermitteln. Leider schlägt das irgenwie fehl. Erst kommt "Nicht genügend Arbeitsspeicher" und dann kommt eine AV. Wo habe ich jetzt schon wieder den Denkfehler? :gruebel:
Delphi-Quellcode:
type
  PROCESSOR_POWER_INFORMATION = packed record
    Number: Cardinal;
    MaxMhz: Cardinal;
    CurrentMhz: Cardinal;
    MhzLimit: Cardinal;
    MaxIdleState: Cardinal;
    CurrentIdleState: Cardinal;
  end;
  PPROCESSOR_POWER_INFORMATION = ^PROCESSOR_POWER_INFORMATION;

function CallNtPowerInformation(InformationLevel: DWORD; InPutBuffer: Pointer; InputBufferSize: ULONG; OutPutBuffer:
  Pointer; OutPutBufferSize: ULONG): DWORD; external 'PowrProf.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  ppi: PROCESSOR_POWER_INFORMATION;
  err: DWORD;
begin
  ZeroMemory(@ppi, sizeof(PROCESSOR_POWER_INFORMATION));
  err := CallNTPowerInformation(11, nil, 0, @ppi, sizeof(PROCESSOR_POWER_INFORMATION));
  if err = 0 then
    ShowMessage(IntToStr(ppi.CurrentMhz))
  else
    ShowMessage(SysErrorMessage(err));
end;

Christian Seehase 15. Feb 2006 20:23

Re: CallNtPowerInformation
 
Moin Luckie,

wenn ich das richtig sehe fehlt die Angabe der Aufrufkonvention stdcall.

Luckie 15. Feb 2006 20:27

Re: CallNtPowerInformation
 
Verdammt! Das passiert mir immer wieder bei solchen Sachen. Aber das Schlimme ist, ich vergesse jedesmal wieder woran es liegt. :wall: Was ich sagen wollte: Das wars, jetzt geht es. ;)

Korrigierter Code:
Delphi-Quellcode:
type
  PROCESSOR_POWER_INFORMATION = packed record
    Number: Cardinal;
    MaxMhz: Cardinal;
    CurrentMhz: Cardinal;
    MhzLimit: Cardinal;
    MaxIdleState: Cardinal;
    CurrentIdleState: Cardinal;
  end;
  PPROCESSOR_POWER_INFORMATION = ^PROCESSOR_POWER_INFORMATION;

function CallNtPowerInformation(InformationLevel: DWORD; InPutBuffer: Pointer; InputBufferSize: ULONG; OutPutBuffer:
  Pointer; OutPutBufferSize: ULONG): DWORD; stdcall; external 'PowrProf.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  ppi: PROCESSOR_POWER_INFORMATION;
  err: DWORD;
begin
  ZeroMemory(@ppi, sizeof(PROCESSOR_POWER_INFORMATION));
  err := CallNTPowerInformation(11, nil, 0, @ppi, sizeof(PROCESSOR_POWER_INFORMATION));
  if err = 0 then
    ShowMessage(IntToStr(ppi.CurrentMhz))
  else
    ShowMessage(SysErrorMessage(err));
end;

MagicAndre1981 15. Feb 2006 20:37

Re: CallNtPowerInformation
 
Warum ermittelst du die Taktfrequnz nicht über RDTSC selber?

Luckie 15. Feb 2006 20:45

Re: CallNtPowerInformation
 
Weil ich es so probieren wollte. Ich bin in einem C Forum daüber gestolpert und da ist mir eingefallen, dass es hier immer wieder Diskrepanzen gab auf den verschiedenen Rechnern. Und warum selber machen, wenn es Windows genauso gut, wenn nicht sogar besser, kann? :zwinker:

BTW:
Requires Windows XP, Windows 2000 Professional, Windows Me, or Windows 98.
Requires Windows Server 2003 or Windows 2000 Server.
Also sogar lauffähig unter Windows ME und 98. ;)

MagicAndre1981 15. Feb 2006 20:53

Re: CallNtPowerInformation
 
Besser? Das will ich überhört haben. Windows ermittelt den Takt nur einmal, am Systemstart, dann steht zum Beispiel immer die Taktfrequenz in dem Systemeigenschaften. Aber mein Notebook geht bis 1,6GHz und nicht nur 600MHz wie Windows dies anzeigt. Zudem takte ich mit RMClock, mein Prozzi lastabhängig und dadurch ändert sich der Takt andauernd.

Deshalb lieber selber machen, das ist besser :zwinker:

André

Luckie 15. Feb 2006 20:55

Re: CallNtPowerInformation
 
Delphi-Quellcode:
PROCESSOR_POWER_INFORMATION = packed record
    Number: Cardinal;
    MaxMhz: Cardinal;
    CurrentMhz: Cardinal; // <-- !!!
    MhzLimit: Cardinal;
    MaxIdleState: Cardinal;
    CurrentIdleState: Cardinal;
  end;
  PPROCESSOR_POWER_INFORMATION = ^PROCESSOR_POWER_INFORMATION;
Guck dir mal das markierte Feld in dem Record an, das dürfte die aktuelle Taktfrequenz sein. ;)

MagicAndre1981 15. Feb 2006 20:58

Re: CallNtPowerInformation
 
Kannste mal bitte ein Testprogramm anhängen (mit exe, hab kein Delphi mehr installiert. Ich müsste erst eins in einer VM installieren) dann kann ich es mal testen.

Luckie 15. Feb 2006 21:00

Re: CallNtPowerInformation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie der Herr wünschen. ;)

Matze 15. Feb 2006 21:09

Re: CallNtPowerInformation
 
Bingo Michael, das funktioniert.
Auch wenn ich mit Centrino Hardware Control die Taktrate verändere, der API-Aufruf ermittelt die aktuelle Taktrate jedesmal von neuem. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz