Einzelnen Beitrag anzeigen

quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#1

PDH_INVALID_ARGUMENT - Wo liegt der Fehler?

  Alt 19. Mär 2009, 12:02
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.dllname '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?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat