Thema: Delphi PChar wiederverwenden?

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

AW: PChar wiederverwenden?

  Alt 8. Okt 2010, 14:01
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 PdhLookupPerfNameByIndexW (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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Okt 2010 um 14:29 Uhr)
  Mit Zitat antworten Zitat