0

アプリケーション互換性ツールキットの「StandardUserAnalyzer」を使用して説明しましたが、次の理由でアプリがUAC互換ではないと報告されました。

「DeleteFileA:ファイル(\ Device \ HarddiskVolume1 \ Documents and Settings \ Administrator \ Local Settings \ Temp \ mtgstudio.madExcept)は、エラー0x5で「DELETE」アクセスを拒否されました。」

「DeleteFileA:ファイル(\ Device \ HarddiskVolume1 \ Documents and Settings \ Administrator \ Local Settings \ Temp)は、エラー0x5で「DELETE」アクセスを拒否されました。」

私が見つけた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関数は、プログラムが一時ファイルを作成できる場所を取得するために使用する関数です。互換性テスターがディレクトリを削除できなかったからといって、ディレクトリが別の場所にあるはずだったわけではありません。これは、プログラムが試行されたときに削除できなかったことを意味するだけです。別のプログラム(テスト対象のプログラムなど)が、これらのディレクトリの1つでファイルを開いていた可能性があります。Windowsでは、開いているファイルがフォルダにある場合、フォルダを削除することはできません。

考えられる問題の原因の1つは、MadExceptがディレクトリを作成する方法です。親ディレクトリのアクセス許可を継承するように作成します。親ディレクトリの削除が禁止されている場合は、新しく作成された一時ディレクトリの削除も禁止されます。これは、システムの構成の問題を部分的にGetTempPath示しています。存在しないディレクトリのパスを返している可能性があります。TMP、TEMP、およびUSERPROFILE環境変数のいずれかで見つかった最初の値を返すだけです。それらが正確であることを確認するのは(プログラムではなく)ユーザーの責任です。

MadExceptがGetTempPath一時ディレクトリを検出するために使用することを知っていると、機会が得られます。プロセスのTMP値を変更するために呼び出すことができSetEnvironmentVariable、MadExceptは代わりにそのディレクトリを作成します。(ただし、一時ファイルのシステム指定の場所がすでに機能しない場合は、別の方法を見つけてください。)

于 2011-09-21T13:54:21.457 に答える