Entwickler-Ecke
Windows API - Einen String mit definierter Länge einkürzen
patmann2001 - Di 03.12.02 20:54
Titel: Einen String mit definierter Länge einkürzen
Hi
Ich habe aus dem Thread
Windowspfad rausbekommen? [
http://www.auq.de/viewtopic.php?t=2442&start=0&postdays=0&postorder=asc&highlight=windows%20pfad] folgende Function entnommen:
| Zitat: |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function GetWinDir: String; const UNLEN = MAX_PATH; var Size: DWORD; begin Size := UNLEN + 1; SetLength(Result, Size); if GetWindowsDirectory(PChar(Result), Size) <> 0 then SetLength(Result, Size - 1) else Result := ''; end; | |
Der entstehende String ist 255 Zeichen lang (length(GetWinDir)), immer, auch wenn die wirkliche anzahl Zeichen deutlich kleiner ist, wie bekomme ich es hin, das die Länge wieder stimmt? Ich kann nämlich leider keinen weiteren String daran anfügen mit +.
cu Patmann
Delete - Di 03.12.02 21:18
Bei mir ist das Ergebnis sogar 260 Zeichen "lang". Aber das liegt einfach nur daran, dass vergessen wurde, dass "uSize" (der zweite Parameter der Funktion "GetWindowsDirectory") ein IN-Parameter ist. Deswegen passiert bei der Zeile
Quelltext
1: 2:
| if GetWindowsDirectory(PChar(Result), Size) <> 0 then SetLength(Result, Size - 1) |
nicht das, was man erwarten würde - nämlich, dass der String gekürzt wird.
Die Anzahl der kopierten Zeichen wird von der Funktion selbst als Ergebnis zurückgegeben. Der Wert von "uSize" ändert sich IMO nicht. Eine einfachere Version könnte daher so aussehen:
Quelltext
1: 2: 3: 4: 5:
| function AnotherTryToGetTheWinDir: string; begin SetLength(Result,MAX_PATH+1); SetLength(Result,GetWindowsDirectory(@Result[1],MAX_PATH+1)); end; |
In diesem Fall ist das Ergebnis bei mir 10 ("c:\windows"). Die Frage wäre nun natürlich: kann man diese Funktion so nutzen? Im Normalfall gehöre ich ja auch zu denen, die lieber eine Absicherung zuviel als zuwenig setzen.
Delete - Mi 04.12.02 18:15
Heute würde ich es wohl so proboeren:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function GetWinDir: String; var buffer: array[0..MAX_PATH+1] of Char; begin Result := ''; ZeroMemory(@buffer, sizeof(buffer)); GetWindowsDirectory(buffer, sizeof(buffer)); if length(String(buffer)) = 0 then Result := '' else Result := String(buffer); end; |
Da buffer ein Char-Array ist wird es automatisch mit \0 abgschlossen von GetWindowsDirectory. Mit length prüfe ich ob auch was angekommen ist.
patmann2001 - Do 05.12.02 08:26
D A N K E
Super, was würde ich wohl Ohne euch machen?
cu Patmann :lol: :mrgreen:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!