ShGetSpecialFolderPath und ShortString ist vollkommen unsauber.
ShortString = immer
ANSI
ShGetSpecialFolderPath =
ANSI (bis D2007) und
Unicode (ab D2009)
ShGetSpecialFolderPathA wäre aber immer
ANSI
siehe
ShGetSpecialFolderPath ... der Buffer muß mindestens MAX_PATH (260) zeichen groß sein, aber ShortString ist nur 255 Zeichen groß.
Delphi-Quellcode:
var
S : array[0..MAX_PATH-1] of Char;
begin
ShGetSpecialFolderPath(0, @S, CSIDL_PPERSONAL, False);
Result := IncludeTrailingPathDelimiter(S); // oder IncludeTrailingBackslash
end;
PS: Du mußt die Länge garnicht wissen.
Delphi baut das StrLen von selber ein, wenn man ein 0-basierendes statisches Char-Array oder einen PChar an einen String (Variable oder Parameter) übergibt.