Pages

自己紹介

某IT技術情報誌に連載記事を持っていたテクニカルライター。またもや休刊してしまったよ。
Copyright © 2011-2016 Daregada. All rights reserved. Powered by Blogger.

gdippの設定ファイルがファイル仮想化によって多重化される問題

2011-02-19

Windows Vista/7でUACが有効な場合、gdippのインストール先を変更しないと、設定ファイル(gdipp_setting.xml)がファイル仮想化によって多重化される問題が起きる可能性があるよ、という話。

Abstract

gdipp関連のブログの記事や掲示板のスレッドを見ていると、
  • 設定ファイルを書き換えてサービスを再起動したのに設定が反映されない
  • 書き換えた設定が有効なアプリと無効なアプリに分かれる
といった書き込みが散見されるので、想定される理由と対応策を述べる。
理由
gdippの設定ファイルを書き換えたテキストエディターがWindows Vista/7のファイル仮想化の対象だった場合、同名の(内容の異なる)設定ファイルが2つ存在する状態になり、gdippの対象アプリの実行権限やマニフェストによってどちらか一方が読み込まれるため。
対策
ファイル仮想化によって作成された互換性ファイルを元の設定ファイルに上書きしてから、以下のいずれかを行なう
  • 管理者権限に昇格させたテキストエディターで設定ファイルを書き換える
  • 一度gdippをアンインストールし、ファイル仮想化の対象外フォルダにインストールしなおす

想定される理由

gdippのデフォルトのインストール先は、%ProgramFiles%以下のgdippフォルダー(一般的には"C:\Program Files\gdipp")だ。 インストーラーに含まれるgdippの設定ファイル(gdipp_setting.xml)も同じフォルダーに配置される。

設定ファイルを書き換える際に問題になるのは、あなたが利用するテキストエディターが、Windows Vista/7で導入された「ファイル仮想化」(File Virtualization)の対象かどうかだ。簡潔に言うと、UACが有効な環境で、管理者権限に昇格していないテキストエディターを使い、"C:\Program Files\gdipp\gdipp_setting.xml"を上書き保存できたのなら、そのテキストエディターはまず間違いなくファイル仮想化の対象だ。詳しい条件については、「Windows Vista/7のファイル仮想化#解説」を参照)。

一般に、ファイル仮想化の対象となるアプリを使って、ファイル仮想化の対象となるフォルダーのファイルを上書き保存すると、実際には別のフォルダーに「互換性ファイル」(Compatibility files)としてリダイレクトされる。エクスプローラーで元のファイルが置かれたフォルダーを開くと、上部に"互換性ファイル"ボタンが表示されるはずだ(このボタンを押すと、リダイレクト先フォルダーに切り替わる)。こうした状況では、「内容を書き換えたファイル(互換性ファイル)」と「内容が元のままのファイル」が同時に存在し、ファイル仮想化の対象アプリは互換性ファイルを(そうとは知らずに)読み込み、対象外アプリは元のファイルをそのまま読み込むことになる。

gdippの場合はちょっと特殊で、2つの設定ファイル(互換性ファイルと元のファイル)のどちらを参照するのかは、gdippの適用対象となるプロセスがファイル仮想化の対象かどうかによって決まる。プロセスがファイル仮想化の対象なら互換性ファイルの設定が利用され、対象外なら元の設定ファイルの設定が利用されるのだ。このため、Firefoxやメモ帳など、ファイル仮想化の対象外であるアプリのプロセスに対しては、「設定ファイルを書き換えてサービスを再起動したのに設定が反映されない」ように見えるし、ファイル仮想化の対象となるプロセスが存在する場合には「書き換えた設定が有効なアプリと無効なアプリに分かれる」ように見えるわけだ。

※このことは、互換性ファイルに基づくフォントの描画を、元の設定ファイルとは明確に異なる設定にすることで簡単に確認できる。たとえば、ガンマ補正の設定(gamma)における赤チャネル(red)の値を0に変更する(黒い文字を赤く表示する)など。

対策

2種類の設定ファイルが使い分けられてしまう状況は、ファイル仮想化によって作成された互換性ファイルを元の設定ファイルに上書きしてから、互換性ファイルを削除することで解消される。具体的には、管理者権限を持ったユーザーで設定ファイルをカット&ペーストすればいい。

  1. エクスプローラーで"C:\Program Files\gdipp"フォルダーを開く
  2. フォルダーウィンドウ上部にある"互換性ファイル"ボタンを押す
  3. 互換性ファイルとして保存された設定ファイル(gdipp_setting.xml)だけが表示されるので、ファイル名を右クリックして"切り取り"を選択
  4. フォルダーウィンドウの←(戻る)ボタンを押し、"C:\Program Files\gdipp"フォルダーに戻る
  5. ウィンドウ内で右クリックして、"貼り付け"を選択し、ファイルの移動ダイアログが表示されたら、"移動して置換"を選択
  6. Windows 7では、管理者のアクセス許可が必要だと表示されるので、"続行"ボタンを押す。Windows Vistaでは、(後ほど確認)。

その後、互換性ファイルを再度作らないようにするには、管理者権限に昇格したテキストエディターで設定ファイルを書き換えるか、一度gdippをアンインストールし、ファイル仮想化の対象外なフォルダにインストールしてから設定ファイルを書き換えればいい。

0 件のコメント:

コメントを投稿