Результат Delphi TPath.GetTempPath обрезается - PullRequest
8 голосов
/ 09 августа 2010

Я использую 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;
[...]

Это происходит только в некоторых системах, и я не знаю почему. Я нашел неприятный обходной путь для этого, но я хотел бы знать, что здесь происходит.

Кто-нибудь может пролить свет на это?

Ответы [ 2 ]

6 голосов
/ 09 августа 2010

На страницах системы внутренней безопасности есть примечание об этой функции Windows API:

"Обратный буфер для GetLongPathName () и аналогичные функции могут возвращать усеченный путь и привести к труднодоступным ошибкам. "

https://buildsecurityin.us -cert.gov / BSI-правила / дома / g1 / 753-BSI.html

Если у вас есть исходный код, вы можете проверить, существует ли проблема, описанная в этой статье, в реализации Delphi 2010.

3 голосов
/ 09 августа 2010

Что произойдет, если вы попытаетесь:

var
  longpath : string;

SetLength(longpath,MAX_PATH);
SetLength(longpath, GetLongPathName(PChar(TmpDir),PChar(LongPath),MAX_PATH));

Это сработало для меня, ваша версия сократила путь.

...