Результат Delphi TPath.GetTempPath обрезается

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

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

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

9
задан mjn 9 August 2010 в 14:19
поделиться

2 ответа

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

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

https://buildsecurityin.us-cert.gov/bsi-rules/home/g1/753-BSI.html

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

6
ответ дан 4 December 2019 в 21:47
поделиться

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

var
  longpath : string;

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

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

3
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: