Ich hoffe kein anderer versucht mit Hilfe der bisher geposteten Codes (Zacherl mal ausgenommen) was zu lernen.
@1234588: Wen denkst du wieviele Bytes du mit New(P) [P: PChar] reservierst? Genau ein einziges. Die Kompressionsalgorithmen sind zwar mittlerweile recht gut, aber so gut auch wieder nicht als dass sie einen mehrere Zeichen umfassenden Pfad in ein Byte quetschen könnten.
Nun zu dem Pascal-Assembler Gemisch. Assembler ist gar nicht notwendig und macht das ganze nur kompliziert.
Delphi-Quellcode:
function GetWindowsDirectory: string;
var
path: array[0..MAX_PATH] of Char;
begin
SetString(Result, path, GetWindowsDirectory(path, SizeOf(path)));
Result := Result + '\';
end;
Und nun zur Lösung des Problems:
Delphi-Quellcode:
function GetSpecialPath(nFolder: Integer): string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
if SHGetSpecialFolderPath(Application.Handle, Buffer, nFolder, False) then
Result := Buffer
else
RaiseLastOSError;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage( GetSpecialPath(CSIDL_APPDATA) );
end;