Как исправить madExcept, кроме создания временных файлов в User \ LocalSettings \ Temp - PullRequest
0 голосов
/ 21 сентября 2011

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

"DeleteFileA: Файл (\ Device \ HarddiskVolume1 \ Documents and Settings \ Administrator \ LocalНастройки \ Temp \ mtgstudio.madExcept) запрещен доступ «УДАЛИТЬ» с ошибкой 0x5. "

" DeleteFileA: Файл (\ Device \ HarddiskVolume1 \ Документы и настройки \ Администратор \ Локальные настройки \ Temp) запрещен "УДАЛИТЬ'access with error 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 Ответ

10 голосов
/ 21 сентября 2011

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

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

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

...