Вот этот код прекрасно работает в Delphi7. FreeaPascal 1.9.6 добавляет перед словом test несколько случайных символов. Если же в выделенной жирным строке явно прописать copy(ac2,1,i), то все Ок. Т.е. я так понимаю, после строки ac2 не записывается #0.
program T;
uses Windows, SysUtils;
function GetSN(LN:string):string;
var ac1,ac2:PAnsiChar;
s:string;
i:integer;
begin
s:=extractfilepath(LN);
ac1:=PAnsiChar(s);
i:=GetShortPathName(ac1,nil,0);
GetMem(ac2,i);
GetShortPathName(ac1,ac2,i);
result:=ac2+extractfilename(LN);
FreeMem(ac2);
end;
begin
writeln ('test -> '+GetSN('test'));
end.
PS. GetMem(ac2,i+1), и FillChar или ac2[i+1]:=#0 не решают проблемы.