0

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

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

“DeleteFileA:文件 (\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;

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

4

1 回答 1

10

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

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

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

于 2011-09-21T13:54:21.457 回答