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?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.