如何解决madExcept在User\LocalSettings\Temp中创建临时文件

Ive*_*aev 0 delphi uac file temp madexcept

我使用应用程序兼容性工具包中的"标准用户分析器"进行了操作,它报告我的应用程序不兼容UAC,因为:

"DeleteFileA:文件(\ Device\HarddiskVolume1\Documents and Settings\Administrator\Local Settings\Temp\mtgstudio.madExcept)被拒绝'DELETE'访问,错误为0x5."

"DeleteFileA:File(\ Device\HarddiskVolume1\Documents and Settings\Administrator\Local 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;
Run Code Online (Sandbox Code Playgroud)

有没有一种好方法可以覆盖madExcept行为并将临时文件存储在UAC允许的位置?

Rob*_*edy 10

它看起来没什么可修复的.该GetTempPathAPI函数正是用来得到其中一个程序被允许创建临时文件的位置的功能.兼容性测试人员无法删除目录并不意味着目录应该在其他地方.它只表示在程序尝试时无法删除它们.可能是另一个程序(例如正在测试的程序)在其中一个目录中打开了一个文件; 当打开文件时,Windows不允许删除文件夹.

一个可能的问题来源是MadExcept创建目录的方式.它创建它们,以便它们继承其父目录的权限.如果禁止对父目录进行删除,则对于新创建的临时目录也将禁止删除.这部分指向系统上的配置问题:GetTempPath可能正在返回不存在的目录的路径.它只返回它在任何TMP,TEMP和USERPROFILE环境变量中找到的第一个值.用户有责任(而非您的程序)确保这些准确无误.

知道MadExcept用于GetTempPath发现临时目录可以为您提供机会.您可以调用SetEnvironmentVariable以更改进程的TMP值,MadExcept将在其中创建其目录.(但是如果临时文件的系统指定位置已经不起作用,那么找到一些替代方法可以好运.)