".local" ファイルを削除しても、".local" ファイルが存在しているかのように DLL が検索される

現象

DLL のリダイレクションを制御する ".local" ファイルを配置した状態でアプリケーションを実行し、DLL の読み込みを行った場合、その後、".local" ファイルを削除しても、DLL の検索パスは ".local" が存在していたときと同じものが使用されます。

原因

Windows Vista 以降の OS では、アプリケーションが最初に起動するとき、「プログラム互換性アシスタント」で設定した情報と共に、 サイド バイ サイド の情報を保持し、2 回目以降の起動では、キャッシュされた情報を利用します。
このとき、 1 回目の 起動で ".local" ファイルが存在していた場合、その情報はキャッシュされ、 2 回目以降の起動ではキャッシュされた情報を利用されます。
ここで、".local" ファイルを削除してもキャッシュ情報は更新されないため、2 回目以降の起動は、".local" ファイルがあるかのように DLL がロードされます。

回避策

アプリケーション起動時に作成されるキャッシュ情報は更新・削除されることはないため、次のいずれかの対応策を行うことで、意図した DLL の読み込みを行うことができます。


・不要な DLL を削除する。
  意図しない DLL を読み込まないように 不要な DLL を削除します。
 

・exe ファイルを更新する。
  キャッシュ内容が更新されます。


・異なるフォルダを利用する。
  キャッシュは、フルパスの情報を保持するため、フォルダ名を変えることにより異なるキャッシュが利用されます。

 
・最初の起動時から ".local" ファイルを削除する。
  キャッシュに ".local" ファイルの存在が保持されません。


・レジストリ DevOverrideEnable を設定する。
  キャッシュを利用せず毎回 ".local" ファイルの確認を行います。


DevOverrideEnable の設定手順
=========================

1) レジストリエディタを起動します。

2) Image File Execution Options キーを マウスの右ボタンで選択します。
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

3) 「新規」を選択して、 REG_DWORD を選択します。

4) 名前に DevOverrideEnable を入力します。

5) 値に 1 を入力します。

6) レジストリエディタを終了させます。

7) OS を再起動させます。


状況

この動作は、本技術情報の対象となる Windows OS の仕様です。
プロパティ

文書番号:2909307 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック