1. Internamente, un string es un apuntador, y como la función es de la API de Windows y no de Delphi, éste no sabría que cantidad de memoria asignarle. Supongo que podrías usar un string pero especificando antes una longitud:
2. El porqué específico del 260 tendrás que preguntárselo a Bill Gates.
3. Ese parámetro indica a la API de Windows de qué tamaño es el buffer donde va a colocar el resultado. Si el tamaño es menor que lo que ocupa el path, windows te devolverá el número de bytes que debe tener tu buffer. Si somos muy exquisitos, deberíamos programar así:
Código Delphi
[-]
var
Path: PChar;
Length: Integer;
begin
Length := GetWindowsDirectory(Path, 0);
GetMem(Path, Length);
try
GetWindowsDirectory(Path, Legth);
finally
FreeMem(Path);
end;
end;
para así usar sólo la memoria indispensable.
4. El que programó ese ejemplo olvidó que un array[0..N] of Char es compatible con string.
// Saludos