我使用应用程序兼容性工具包中的"Standard User Analyzer“进行了测试,它报告说我的应用程序不兼容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允许的位置?
发布于 2011-09-21 21:54:21
看起来没有什么需要修复的。GetTempPath应用编程接口函数正是用于获取允许程序创建临时文件的位置的函数。兼容性测试程序无法删除目录并不意味着这些目录应该在其他地方。这只意味着在程序尝试的时候它们不能被删除。可能是另一个程序(例如正在测试的程序)在其中一个目录中打开了一个文件;Windows不允许在文件夹中有打开的文件时将其删除。
一个可能的问题来源是MadExcept创建目录的方式。它创建它们,以便它们继承其父目录的权限。如果父目录禁止删除,则新建的临时目录也将禁止删除。这在一定程度上指出了系统上的配置问题:GetTempPath可能会返回一个不存在的目录的路径。它只返回在TMP、TEMP和USERPROFILE环境变量中找到的第一个值。这是用户的责任(而不是你的程序),以确保这些是准确的。
了解MadExcept使用GetTempPath发现临时目录给了您一个机会。您可以调用SetEnvironmentVariable来更改您的进程的TMP值,MadExcept将在那里创建它的目录。(但是,如果系统指定的临时文件位置已经不起作用,那么祝您好运,找到其他可用的位置。)
https://stackoverflow.com/questions/7500679
复制相似问题