Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PDH_INVALID_ARGUMENT - Wo liegt der Fehler? (https://www.delphipraxis.net/131128-pdh_invalid_argument-wo-liegt-der-fehler.html)

quendolineDD 19. Mär 2009 11:02


PDH_INVALID_ARGUMENT - Wo liegt der Fehler?
 
Hallo DP,

ich ärgere mich hier schon seit 2 Tagen mit dieser WinApi-Funktion herum. Diese möchte ich nutzen, um mir die Prozessorauslastung eines Mehrkerneprozessors anzeigen zu lassen. In C++ mit Visual Studio 2008 läuft das ganze problemlos. Die Funktion nach Delphi portiert und da geht es gar nicht.
Delphi-Quellcode:
type
  PDH_STATUS = Cardinal;

  function PdhEnumObjectItems (
                              szDataSource          : LPCTSTR;
                              szMachineName         : LPCTSTR;
                              szObjectName          : LPCTSTR;
                              mszCounterList        : LPTSTR;
                              pcchCounterListLength : LPDWORD;
                              mszInstanceList       : LPTSTR;
                              pcchInstanceListLength : LPDWORD;
                              dwDetailLevel,
                              dwFlags               : DWORD) : PDH_STATUS;
  external 'Pdh.dll' name 'PdhEnumObjectItemsA';

[...]

procedure TForm1.Button1Click(Sender: TObject);
Const PERF_DETAIL_WIZARD = 400;
function StringToChar (const Str : String; var Chr : PChar) : Integer;
begin
  for Result := 0 to Length(Str) do
    GetMem (Chr, Result +1);

  StrPCopy(Chr, Str);
end;
var
  erg : PDH_STATUS;
  szCounterList : LPTSTR;
  dwCounterListLength : DWORD;
  szInstanceList : LPTSTR;
  dwInstanceListLength : DWORD;
  szObjectItem : LPTSTR;
  lpMsgBuf : LPTSTR;
begin
szCounterList := nil;
dwCounterListLength := 0;
szInstanceList := nil;
dwInstanceListLength := 0;
StringToChar('Processor', szObjectItem);
  erg := PdhEnumObjectItems (
          nil,
          nil,
          szObjectItem,
          szCounterList,
          @dwCounterListLength,
          szInstanceList,
          @dwInstanceListLength,
          PERF_DETAIL_WIZARD,
          0);
Result-Value der Funktion ist jedoch nicht wie erwartet PDH_MORE_DATA sondern PDH_INVALID_ARGUMENT.
MSDN schreibt dazu
Zitat:

A parameter is not valid. For example, on some releases you could receive this error if the specified size on input is greater than zero but less than the required size.
Jedoch initialisiere ich alles auf 0 und nil, um erstmal die erwartet Größe zurückzubekommen.

Vielleicht findet jemand des Rätsels Lösung?

quendolineDD 20. Mär 2009 12:49

Re: PDH_INVALID_ARGUMENT - Wo liegt der Fehler?
 
*push*
Niemand, der mein Problem nachvollziehen kann?

Dezipaitor 21. Mär 2009 02:13

Re: PDH_INVALID_ARGUMENT - Wo liegt der Fehler?
 
stdcall vergessen?

jaenicke 21. Mär 2009 04:15

Re: PDH_INVALID_ARGUMENT - Wo liegt der Fehler?
 
So ist es, stdcall fehlt und damit sind die Parameter natürlich falsch.

Die Frage ist aber warum du dir überhaupt selbst die Mühe mit der Übersetzung machst. In den JEDI API Übersetzungen ist die Funktion bereits enthalten:
http://jedi-apilib.sourceforge.net/
(Entsprechend der angegebenen Headerdatei Pdh.h in der entsprechenden Datei JwaPdh.pas.)

Dezipaitor 21. Mär 2009 12:08

Re: PDH_INVALID_ARGUMENT - Wo liegt der Fehler?
 
Verständnis erlangen will er :coder:

quendolineDD 21. Mär 2009 16:33

Re: PDH_INVALID_ARGUMENT - Wo liegt der Fehler?
 
Zitat:

Zitat von Dezipaitor
Verständnis erlangen will er :coder:

Richtig, nur wie banal manche Fehler sind ... :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.

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