Я использую Delphi 2010, и моя программа хочет получить временный путь к системе. Я использую TPath.GetTempPath, и все работает нормально ... по крайней мере, для меня и моих коллег. Но на некоторых клиентских машинах этот метод возвращает обрезанный путь, который (конечно) не существует. Я обнаружил, что проблема, кажется, является результатом основного вызова GetLongPathName ().
Полный код выглядит следующим образом:
[...]
var
TmpDir : String;
Len : Integer;
begin
[... Call to GetTempPath succeeds and we have a valid temp directory in short "~" notation in var TmpDir ...]
Len := GetLongPathName(PChar(TmpDir), nil, 0); // Len = 37
SetLength(TmpDir, Len - 1); // We want to set the len of TmpDir to 37 - 1.
GetLongPathName(PChar(TmpDir), PChar(TmpDir), Len); // Only 32 (instead of 36) characters are copied - so we have a cropped path - But why?!
end;
[...]
Это происходит только в некоторых системах, и я не знаю почему. Я нашел неприятный обходной путь для этого, но я хотел бы знать, что здесь происходит.
Может ли кто-нибудь пролить свет на это?
На страницах внутренней безопасности есть примечание об этой функции Windows API:
«Буфер возврата для GetLongPathName () и аналогичные функции могут возвращать усеченный пути и приводят к трудно обнаруживаемым ошибкам »
https://buildsecurityin.us-cert.gov/bsi-rules/home/g1/753-BSI.html
Если у вас есть исходный код, вы можете проверить, существует ли проблема, описанная в этой статье, в реализации Delphi 2010.
Что произойдет, если вы попробуете:
var
longpath : string;
SetLength(longpath,MAX_PATH);
SetLength(longpath, GetLongPathName(PChar(TmpDir),PChar(LongPath),MAX_PATH));
Это сработало для мне ваша версия обрезала путь.