".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 - 最終更新日: 09/29/2016 15:29:00 - リビジョン: 3.0

Windows Vista Service Pack 2, Windows 7 Professional, Windows 8, Windows 8.1

  • KB2909307
フィードバック