Das riecht doch sehr danach,
es riecht nicht nur ... das stickt schon richtig
Zitat von
siehe MSDN/PSDK:
Size of the szNameBuffer buffer, in TCHARs. If zero on input, the function returns PDH_MORE_DATA and sets this parameter to the required buffer size. If the buffer is larger than the required size, the function sets this parameter to the actual size of the buffer that was used. If the specified size on input is greater than zero but less than the required size, you should not rely on the returned size to reallocate the buffer.
also schreib bitte
_BufferSize div SizeOf(Char)
, denn da wird nicht die Größe in Byte angegeben.
Heißt also, da du mit Delphi 2010 arbeitest, daß die 100 = 100 Zeichen aka 200 Byte entspricht.
also bei 50 bis 100 Zeichen würdest du dir einen Bufferoverrun einhandeln
OK, da es hier ein Var-Parameter ist, wäre es wohl einfacher, wenn du beim GetMem
* SizeOf(Char)
rechnest.
[add]
wobei ich auch gern mal einen anderen Weg geh
Delphi-Quellcode:
var _Index, _BufferSize : LongWord;
_ValueName : String;
_Status : PDH_STATUS;
begin
_Index := 238; // (Processor) : 238
_BufferSize := 0;
PdhLookupPerfNameByIndex(Nil, _Index, Nil, _BufferSize);
SetLength(_ValueName, _BufferSize - 1);
_Status := PdhLookupPerfNameByIndex(Nil, _Index, PChar(_ValueName), _BufferSize);
if _Status = ERROR_SUCCESS then
Log('ValueName : ' + _ValueName)
else
Log('Status : ' + IntToHex(_Status, 8));
_Index := 6; // (% Processor Time) : 6
_BufferSize := 0;
PdhLookupPerfNameByIndexW(Nil, _Index, Nil, _BufferSize);
SetLength(_ValueName, _BufferSize - 1);
_Status := PdhLookupPerfNameByIndexW(Nil, _Index, PChar(_ValueName), _BufferSize);
if _Status = ERROR_SUCCESS then
Log('ValueName : ' + _ValueName)
else
Log('Status : ' + IntToHex(_Status, 8));
Wenn du noch mehr solcher Werte ausließt, dann würde ich das Auslesen lieber in eine Funktion packen.
PS: du nutzt PChar (dynamisch) und PdhLookupPerfNameByIndex
W (statisch) zusammen
entweder:
PAnsiChar + ...A
PWideChar + ...W
PChar + ...
Unter Anderem sowas ist für viele Fehler verantwortlich, welche es mit der
Ansi-
Unicode-Umstellung seit Delphi 2009 gibt.