Как исправить 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 создаст свой каталог там. (Но если системное местоположение для временных файлов уже не работает, удачи в поиске альтернативы.)