4

FileExists() でチェックしたいファイルは、そこにあったとしても決して見つからないようです。他のファイルは毎回見つかります。

ファイル「driver.sys」を「C:\Windows\System32\drivers\」ディレクトリに配置すると、ファイルが見つかりません (関数を呼び出すたびに FileExists が false になります)。ファイルを Windows ルート「C:\Windows\」に移動すると、ファイルが見つかります。

これは機能しません (ファイルは間違いなくフォルダー 'C:\Windows\System32\drivers\' にあります):

function isNotDriverInstalled(): Boolean;
begin
  if (FileExists('C:\Windows\System32\drivers\driver.sys')) then begin
    Log('File exists');
    Result := False;
  end else begin
    Log('File doesn''t exist');
    Result := True;
  end;
end;

これは機能します (ファイルがフォルダー 'C:\Windows\' にある間):

function isNotDriverInstalled(): Boolean;
begin
  if (FileExists('C:\Windows\driver.sys')) then begin
    Log('File exists');
    Result := False;
  end else begin
    Log('File doesn''t exist');
    Result := True;
  end;
end;

ところで:私はWindows 7、64ビットを使用しています。

誰もそのようなケースを経験したことがありますか?助言がありますか?

事前にt​​hx!

4

1 に答える 1

8

ディレクトリはによりパスにSystem32マップされるため、ご覧のとおり、そのようなディレクトリ パスのハードコーディングはそれほど簡単ではありません。以下にリストされている組み込み定数のいずれかを使用することをお勧めします。SysNativeFile System Redirector

1. {sys} 定数:

定数を使用でき{sys}ますが、セットアップを 64 ビット モードで実行できるようにしてください。その方法の詳細については、ディレクティブ リファレンスを参照し、トピックArchitecturesInstallIn64BitModeを必ずお読みください。64-bit Installation Limitations

{sys}定数参照から:

システムの System32 ディレクトリ。例: エントリで {sys}\CTL3D32.DLL を使用し、システムの Windows システム ディレクトリが "C:\WINDOWS\SYSTEM" である場合、セットアップまたはアンインストールによって "C:\WINDOWS\SYSTEM\CTL3D32.DLL" に変換されます。 "。

64 ビット Windows では、デフォルトで、この定数によって返される System32 パスは、32 ビット Windows と同様に、32 ビット システム ファイルを含むディレクトリにマップされます。(これは、64 ビット モードを有効にすることでオーバーライドできます。)

使用方法は次のとおりです。

if FileExists(ExpandConstant('{sys}\drivers\driver.sys')) then
  Log('File exists');

2. {syswow64} 定数:

{syswow64}定数参照から:

64 ビット Windows では、システムの SysWOW64 ディレクトリで、通常は「C:\WINDOWS\SysWOW64」です。これは、32 ビット システム ファイルが存在する実際のディレクトリです。32 ビット Windows では、32 ビット システム ファイルは別の SysWOW64 ディレクトリではなく、"System32" または "System" に存在するため、この定数を使用すると、{sys} と同じディレクトリに解決されます。

32 ビット システム ファイルが存在する実際のディレクトリの名前を取得する必要がある場合を除き、この定数は使用しないでください。{sys} で十分な場所で {syswow64} を不当に使用すると、問題が発生する可能性があります。(一例として、[Files] セクションの sharedfile フラグのドキュメントを参照してください。)

使用方法は次のとおりです。

if FileExists(ExpandConstant('{syswow64}\drivers\driver.sys')) then
  Log('File exists');
于 2012-12-06T20:34:45.040 に答える