![]() |
Exception beim Ermitteln des TEMP-Ordners unter Delphi 2010
Hallo mal wieder!
Anhand von diesem Tip: ![]() Zitat:
Delphi-Quellcode:
1) Kann das jemand nachvollziehen
function Test1: string;
var Buffer: array[0..MAX_PATH] of Char; begin GetTempPath(SizeOf(Buffer) - 1, Buffer); Result := Buffer; end; procedure TForm2.Button1Click(Sender: TObject); begin Caption := Test1; end; 2) Mache ich was falsch? Wohl ja, irgendwelche Pointer sind nicht initialisiert oder so? 3) Gibt es einen alternativen Weg, den TEMP-Ordner als String zu bekommen? Danke im Vorraus, Mathias Edit: Ich würde ja fast vermuten: SetLength(Result, MAX_PATH); , aber seit wann muss einem String Speicher zugewiesen werden? |
Re: Exception beim Ermitteln des TEMP-Ordners unter Delphi 2
Ich hab kein Delphi 2010, aber wie sieht es so aus?
Delphi-Quellcode:
function Test1: string;
begin SetLength(Result,GetTempPath(0, nil) + 1); GetTempPath(Length(Result),PChar(Result)); end; |
Re: Exception beim Ermitteln des TEMP-Ordners unter Delphi 2
Auch wenn es nicht optimal ist, wenn man eine WinAPI aufruft und ihren Rückgabewert ungeprüft verwenden will...
Delphi-Quellcode:
SizeOf = Bytes
function Test1: string;
var Buffer: array[0..MAX_PATH] of Char; begin GetTempPath(Length(Buffer), Buffer); Result := Buffer; end; aber der Parameter will Chars (Zeichenanzahl) > siehe ![]() GetTempPath füllt den Puffer mit Nullen und schreibt einen String an den Anfang D2010 = Unicode (2 Byte pro Char) und schwups hast du einen Pufferüberlauf, da du behauptest der Puffer wäre größer, als er ist. |
Re: Exception beim Ermitteln des TEMP-Ordners unter Delphi 2
@DeddyH: Funktioniert einwandfrei, vielen Dank! Edit: Achtung Siehe unten!
@himitsu: Genau sowas habe ich befürchtet. Wie hätte man denn jetzt idealerweise den Rückgabewert geprüft? Wenn ich das richtig verstehe, hat Delphi bis 2007 (2009?) bei SizeOf -in diesem Fall- den identischen Wert zurückgegeben wie length, und es war -in diesem Fall- egal was man verwendete. Oder war das Beispiel auf ![]() Wenn ich jetzt all meine Quellcodes durchsehe und will die 2010 "fit" machen, worauf muss ich also achten? Überall da wo mit Char und SizeOf oder Length gearbeitet schauen ob das stimmt? Wegen Unicode und so? Edit: Achtung, DeddyH: Bei deinem Code sind hängt noch #0#0 an dem String dran. Damit kann ich also nicht tmpString := GetTempFolder + 'temp.tmp' machen; der String verändert sich nicht mehr. Mit:
Delphi-Quellcode:
geht es, aber es ist die Frage, ob man nicht direkt mit -1 statt +1 arbeiten müsste/sollte? Keine Ahnung...
SetLength(Result,GetTempPath(0, nil) + 1);
GetTempPath(Length(Result),PChar(Result)); Result := trim(Result); |
Re: Exception beim Ermitteln des TEMP-Ordners unter Delphi 2
Dann lass das "+ 1" mal weg, da scheine ich das MSDN falsch verstanden zu haben.
|
Re: Exception beim Ermitteln des TEMP-Ordners unter Delphi 2
Naja, selbst dann wäre noch ein #0 zuviel. Laut MSDN wird ja die Länge (length) von dem string zurückgegeben, ohne TerminationCharacter, den muss man also noch dazuzählen wenn man die Puffergröße festlegen will, deshalb wäre imho die +1 auch ok. Ich kapiert das nicht.
|
Re: Exception beim Ermitteln des TEMP-Ordners unter Delphi 2
Nein, das hatte ich ja auch erst so verstanden, aber dann noch einmal gelesen.
Zitat:
Delphi-Quellcode:
Sollte auf jeden Fall passen ;)[/edit]
function TempPath: string;
begin SetLength(Result,GetTempPath(0, nil)); GetTempPath(Length(Result),PChar(Result)); SetLength(Result,StrLen(PChar(Result))); end; [edit2] Was auch gehen müsste:
Delphi-Quellcode:
[/edit2]
function TempPath: string;
begin SetLength(Result,GetTempPath(0, nil)); SetLength(Result,GetTempPath(Length(Result),PChar(Result))); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 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