Как исправить madExcept, кроме создания временных файлов в User\LocalSettings\Temp

Я выполнил тестирование с использованием "Standard User Analyzer" из набора средств для обеспечения совместимости приложений, и он сообщил, что мое приложение несовместимо с UAC, поскольку:

"DeleteFileA: файлу (\Device\HarddiskVolume1\Documents and Settings\Administrator\Local Settings\Temp\mtgstudio.madExcept) отказано в доступе" DELETE "с ошибкой 0x5."

"DeleteFileA: Файлу (\ Device \ HarddiskVolume1 \ Documents and Settings \ Администратор \ Локальные настройки \Temp) отказано в доступе" DELETE "с ошибкой 0x5."

Проверяя файл madExcept.pas, я нашел:

function GetTempPath : AnsiString;
var arrCh : array [0..MAX_PATH] of AnsiChar;
begin
  if windows.GetTempPathA(MAX_PATH, arrCh) > 0 then begin
    result := arrCh;
    if result <> '' then begin
      CreateDirectoryA(PAnsiChar(result), nil);
      if result[Length(result)] <> '\' then
        result := result + '\';
      result := result + KillExt(ExtractFileName(ModuleName(0))) + '.madExcept';
      CreateDirectoryA(PAnsiChar(result), nil);
      result := result + '\';
    end;
  end else
    result := '';
end;

Есть ли хороший способ перезаписать поведение madExcept и сохранить временные файлы в разрешенном месте UAC?

1 ответ

Решение

Не похоже, что есть что-то, что можно исправить. GetTempPath Функция API - это именно та функция, которая используется для определения местоположения, в котором программе разрешено создавать временные файлы. То, что тестер совместимости не смог удалить каталоги, не означает, что каталоги должны были быть где-то еще. Это только означает, что они не могли быть удалены во время попытки программы. Возможно, что другая программа (например, тестируемая) открыла файл в одном из этих каталогов; Windows не позволяет удалять папки, если в них есть открытые файлы.

Одним из возможных источников проблем является то, как MadExcept создает каталоги. Он создает их так, что они наследуют разрешения своих родительских каталогов. Если удаление запрещено для родительского каталога, то оно также будет запрещено для вновь создаваемых временных каталогов. Это частично указывает на проблему конфигурации в вашей системе: GetTempPath может возвращать путь к каталогу, который не существует. Он просто возвращает первое найденное значение в любой из переменных среды TMP, TEMP и USERPROFILE. Это ответственность пользователя (не вашей программы), чтобы убедиться, что они точны.

Зная, что MadExcept использует GetTempPath обнаружить временный каталог дает вам возможность. Ты можешь позвонить SetEnvironmentVariable изменить значение TMP для вашего процесса, и вместо этого MadExcept создаст свой каталог там. (Но если системное местоположение для временных файлов уже не работает, удачи в поиске альтернативы.)

Другие вопросы по тегам