Autor Beitrag
patmann2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Di 03.12.02 20:54 
Hi
Ich habe aus dem Thread Windowspfad rausbekommen? folgende Function entnommen:
Zitat:
ausblenden 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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ausblenden 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:
ausblenden 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.12.02 18:15 
Heute würde ich es wohl so proboeren:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Do 05.12.02 08:26 
D A N K E
Super, was würde ich wohl Ohne euch machen?

cu Patmann :lol: :mrgreen: