![]() |
PChar wiederverwenden?
Moin !
Ich habe da ein Stück Code was ich zum dynamischen Auslesen von Performance Countern nutzen möchte:
Delphi-Quellcode:
Nun bekomme ich über _Res den ermittelten Namen zurück in einem Buffer.
var _IndexA, _IndexB,
_BufferSize : LongWord; _Res : PChar; _ValueName : String; _Status : PDH_STATUS; begin _IndexA := 238; // (Processor) : 238 _IndexB := 6; // (% Processor Time) : 6 _BufferSize := 100; GetMem(_Res, _BufferSize); _Status := PdhLookupPerfNameByIndexW(Nil, _IndexA, _Res, _BufferSize); if _Status = ERROR_SUCCESS then begin Log('ValueName : ' + PChar(_Res)); _ValueName := PChar(_Res); end else Log('Status : ' + IntToHex(_Status, 8)); FreeMem(_Res); _res := NIL; GetMem(_Res, _BufferSize); _Status := PdhLookupPerfNameByIndexW(Nil, _IndexB, _Res, _BufferSize); if _Status = ERROR_SUCCESS then begin Log('ValueName : ' + PChar(_Res)); end else Log('Status : ' + IntToHex(_Status, 8)); Beim ersten Aufruf klappt es auch. Aber beim zweiten kriege ich den Fehler das der Buffer zu klein wäre. Das kann aber nicht sein, denn wenn ich nur den unteren Teil verwende klappt das wunderbar. Es muss also an meiner Verwendung von _Res (PChar) liegen. Nur was ist da falsch? Ob mit oder ohne _res := NIL spielt übrigens keine Rolle. |
AW: PChar wiederverwenden?
Moin !
Kanns mir selber beantworten ... PdhLookupPerfNameByIndexW beeinflusst die Buffersize ... Und die ist danach zu klein für den zweiten Wert. :roll: |
AW: PChar wiederverwenden?
Das riecht doch sehr danach, das _Buffersize nach der Rückkehr die Länge des Strings enthält. Also setz es neu und es sollte klappen.
Ich hab die Doku nur überflogen aber vllt. geht es auch so:
Delphi-Quellcode:
Gruß
_res := NIL;
_Buffersize:=0; _Status := PdhLookupPerfNameByIndexW(Nil, _IndexB, _Res, _BufferSize); GetMem(_Res, _BufferSize); _Status := PdhLookupPerfNameByIndexW(Nil, _IndexB, _Res, _BufferSize); K-H zu spät (sniief) |
AW: PChar wiederverwenden?
Zitat:
|
AW: PChar wiederverwenden?
Zitat:
Zitat:
Delphi-Quellcode:
, denn da wird nicht die Größe in Byte angegeben.
_BufferSize div SizeOf(Char)
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 :warn: OK, da es hier ein Var-Parameter ist, wäre es wohl einfacher, wenn du beim GetMem
Delphi-Quellcode:
rechnest.
* SizeOf(Char)
[add] wobei ich auch gern mal einen anderen Weg geh :angel2:
Delphi-Quellcode:
Wenn du noch mehr solcher Werte ausließt, dann würde ich das Auslesen lieber in eine Funktion packen.
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)); PS: du nutzt PChar (dynamisch) und PdhLookupPerfNameByIndexW (statisch) zusammen :warn: 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. |
AW: PChar wiederverwenden?
Nich schlagen 8-)
Ich habs ja noch früh genug selber gemerkt :stupid: |
AW: PChar wiederverwenden?
Keine Sorge ... hab meinen Baseballschläger eh noch (im Laden) vergessen.
Und das "in TCHARs" nicht vergessen. |
AW: PChar wiederverwenden?
Inzwischen klappt alles:
Code:
:)
[14:26:17] : \\XYZ\Processor(0)\% Processor Time
[14:26:17] : Value : 12,5 [14:26:17] : \\XYZ\Processor(1)\% Processor Time [14:26:18] : Value : 6,1 [14:26:18] : \\XYZ\Processor(_Total)\% Processor Time [14:26:18] : Value : 3,1 |
AW: PChar wiederverwenden?
12,5 + 6,1 ist für mich aber ~9,3 :roll:
|
AW: PChar wiederverwenden?
Hast schon Recht, aber ich habe zwischen den Messungen je 500ms Pause gehabt.
Insofern passt deine Rechnung nicht :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 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