#outline|| ---- * はじめに このドキュメントは、Windows2000以上の環境で、レジストリを直接編集することによりファイルの拡張子とその関連づけの設定を行うための指南書として作成したものです。 通常、ユーザーレベルでファイルの関連づけを設定するには以下の方法が提供されています。 - エクスプローラの「ツール」→「フォルダオプション」 - ファイルを右クリックして表示されるコンテキストメニューの「プログラムから開く」 - ログインユーザーのホームディレクトリ(Documents and Settings\(USER))の「SendTo」へのショートカットの追加 しかし、トラブルが起こった場合上記の設定を弄くるだけでは解決しない場合も多々あります。(往々にしてそういうトラブルの解決策はネット上にすら存在しません。)そういった場合、最終手段としてレジストリを直接編集し、拡張子とその関連づけを設定し直す必要があります。 このドキュメントは、そのような局面において「広大なレジストリのどこを編集すれば良いのか?」を解説するものです。 なお、このドキュメントは '' 無保証であり、無保障です。'' このドキュメントを参考にした操作により発生したいかなる現象も、操作を行った者の自己責任となります。ありきたりですが予防線でした。 ** 注意 このドキュメントを読む対象としては、レジストリエディタを起動し、操作できる人間を仮定しています。「レジストリエディタって何?」とか、「キーの追加ってどうやるの?」という方は、まずは「regedit.exe」などで検索し、使い方を覚えてからこのドキュメントを利用してください。(残念ですがそこまで手が回らないッス・・・) * 編集対象のレジストリ群 ファイルの拡張子とその関連づけを保っているレジストリとそのキーを以下に示します。 : HKEY_LOCAL_MACHINE(HKLM)\SOFTWARE\Classes : 拡張子と、「ProgID」とも呼ばれる「アプリケーション識別子」が登録されています。 : HKEY_LOCAL_MACHIN(HKLM)\SOFTWARE\Classes\Applications : 上のサブキーとなりますが、重要です。なぜなら「プログラムから開く」に一覧表示されるアプリケーション群の設定が格納されるからです。 : HKEY_USERS(HKU)\(ユーザー識別子)\Software\Classes\Applications : 「プログラムから開く」の「参照」で手動選択した実行ファイルの設定が格納されます。 いわば、HKEY_LOCAL_MACHIN\SOFTWARE\Classes\Applications のユーザー別の設定です。 : (HKEY_USERS\(ユーザー識別子)_Classes) : HKEY_USERS\(ユーザー識別子)\Software\Classes へのシュートカットです。 このように、実際に操作するレジストリの範囲は案外と狭かったりします。しかし、今までレジストリをさわったり弄ったことのある人なら次の疑問が生じるかもしれません。 「HKEY_CLASSES_ROOT(HKCR)キーは操作しないのですか?」 これに対する答えとしては、 「HKCRはHKLM\SOFTWARE\Classes + HKU\(ユーザー識別子)\Software\Classes\Applications である」 つまり、HKEY_CLASS_ROOTはエイリアス(別名)であり、あくまでも「現在ログイン中のユーザー設定の確認用」として使用すべきなのです。実際に編集すると分かりますが、HKLM\Software\Classes や HKU\...\Software\Classes\Applications に対して行った変更は直ちに HKCR 以下にも反映されます。 本ドキュメントでは、「HKCRの実体は別にある」ことを明確にするため、あえてHKCRではなくその元となるHKLMやHKUを操作することにします。 * ファイルの拡張子とその関連づけを設定するには ** 操作1:アプリケーションのProgIDを登録する。 最初に行うのは、HKLM\Software\Classes 以下に「 ''ProgID'' 」と呼ばれる形でアプリケーションを登録することです。 結論から先に言ってしまうと、Windowsのエクスプローラ(と言うよりは"シェル")は、ファイルがダブルクリックされると以下の順でたどっていきます。 拡張子 → 拡張子に設定された ProgID → ProgID に設定された実行ファイル本体 従って、とにもかくにも "ProgID" を登録しないと始まらないわけです。 + "ProgID"となるキーを HKLM\SOFTWARE\Classes 以下に登録します。このキー名は実行ファイル名とは関係なく、アプリケーションが扱うドキュメントの説明文字列みたくします。今回は「hoge.exe」というアプリを想定し、「Hoge.Document」という名前でキーを登録します。 + 「Hoge.Document」以下に「shell」キーを追加します。 + その中に「open」キーを追加します。 + さらにその中に「command」キーを追加します。 + 「command」キーの「(既定)」エントリを編集し、hoge.exe へのフルパスと、ファイル名の指示方法を設定します。ダブルクリックされたファイル名は "%1" という変数で取得できますので、たとえば次のようになります。 C:\Program Files\Hoge\hoge.exe "%1" この時点までを自動登録するファイル「hoge1.reg」の内容を示します。 - hoge1.reg [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Hoge.Document] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Hoge.Document\shell] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Hoge.Document\shell\open] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Hoge.Document\shell\open\command] @="\"C:\\Program Files\\Hoge\\hoge.exe\" \"%1\"" ** 操作2:拡張子を登録し、関連づけを行う。 続いて拡張子を登録します。今回は「.hoge」という新たな拡張子を設定してみます。 + HKLM\Software\Classes 以下に「.hoge」というキーを追加します。 + 「(既定)」エントリを編集し、先ほど追加した「Hoge.Document」というProgIDに設定します。これにより、「.hoge」という拡張子をダブルクリックすると「hoge.exe」が起動するようになります。今回の操作を自動登録するファイル「hoge2.reg」の内容を示します。 - hoge2.reg [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.hoge] @="Hoge.Document" ・・・実は、たったこれだけで拡張子の関連づけができてしまいます。後の細かい設定は、エクスプローラの「ツール」→「フォルダオプション」→「ファイルの種類」で行う方が良いと思います。アイコンとかの設定は、そちらから行った方が断然楽だと思います。 * 新しい拡張子のファイルをダブルクリックしたとき、何が起こるか? まだシステムに登録していない拡張子のファイルをダブルクリックすると、開くアプリケーションを選択する画面が表示されます。そこで自分でアプリを選択すれば、自動的にその拡張子の関連づけを行ってくれます。この裏側では何が行われているのでしょうか? 結論から言うと、 ''「拡張子_auto_file」という ProgID を自動的に生成'' しています。 上の例で言うなら、自動的に以下のエントリを設定してくれるわけです。 - hoge_auto.reg [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.hoge] @="hoge_auto_file" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\hoge_auto_file] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\hoge_auto_file\shell] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\hoge_auto_file\shell\open] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\hoge_auto_file\shell\open\command] @="\"C:\\Program Files\\Hoge\\hoge.exe\" \"%1\"" * 「プログラムから開く」のからくり(Inside for "Open With..." dialog box.) 著者がこのドキュメントを公開する直接の動機は、 ''「プログラムから開く」でプログラムを参照できない'' というトラブルに見舞われた経験から来ています。(原因そのものは非常に単純なものでしたが・・・) しかし、トラブルに見舞われずとも「プログラムから開く」で表示されるプログラムの一覧はどこから来ているのか、不思議に思われている方も多いのではないでしょうか?さらに不思議なのは、一度でも「参照」で自分で設定したプログラムは、自動的に一覧に登録してくれる点です。 ここではそのからくりについてみていきます。からくり・・・と言っても、その原理は驚くほど単純です。 ** "NoOpenWith"エントリ (Excluding your applications from "Open With..." dialog box list.) 結論から言うと、「プログラムから開く」(英語だと「Open With...」)に表示されるプログラムの一覧は、次のレジストリキー以下にあります。 HKEY_LOCAL_MACHIN\\SOFTWARE\Classes\Applications ユーザーが「参照」で自分で指定したプログラムの一覧は、次のレジストリキー以下に保存されます。 HKEY_USERS\(ユーザー識別子)\Software\Classes\Applications では、今回の例に従い実際に「hoge.exe」を追加してみます。ユーザー別ではなく、HKLMの方を利用してみましょう。結論から提示します。以下の自動登録ファイルのようになります。 - hoge_openwith.reg [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\hoge.exe] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\hoge.exe\shell] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\hoge.exe\shell\open] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\hoge.exe\shell\open\command] @="\"C:\\Program Files\\Hoge\\hoge.exe\" \"%1\"" "ProgID"の登録の時と似ています。ユーザーが自分で「参照」で選択した場合、 HKU\...\Classes\Applications 以下にこれと同様のキーとエントリが追加されます。 しかし、実際には HKLM\Software\Classes\Applications には一覧で表示されるよりも遙かに多数の .exe が登録されています。それらはなぜ表示されないのか?結論から言うと、 ''「NoOpenWith」エントリが存在するから'' です。 NoOpenWith エントリ自体は中身が空の文字列ですが、これが設定されているキーは「プログラムから開く」の一覧には表示されません。 ** 「プログラムから開く」の履歴 (How to delete history from "Open With..." sub menu) これはインターネット上でも広く知られているTipsです。 HKEY_USERS\...\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts 上記中に、これまでユーザーが開いてきた拡張子の一覧がキーとして登録されています。さらにその中の "OpenWithList" 中に、a から始まるエントリが存在します。それがこれまでそのファイルを開いてきたプログラムの履歴となります。 履歴を削除するには、好みのエントリを削除すれば良いわけです。 ** トラブルシューティング(Trouble Shooting) 著者自身が遭遇したトラブルは、"「プログラムから開く」でプログラムを参照できない」"という珍妙な現象でした。原因は単純で、 ''C:\Program Files 以下にインストールしたフリーソフトのエディタを、丸ごとマイドキュメント以下に移動したことが原因'' でした。 詳しく説明すると、C:\Program Files 以下にインストールした時点で、一度「プログラムから開く」で参照できました。「プログラムから開く」の一覧にも表示されていました。この時点で、HKU\...\Software\Classes\Applications 以下にそのエディタのキーが登録されます。(利用したエディタは、インストーラなど無く、圧縮ファイルで展開されたフォルダ中のexeを実行すればそれで済むタイプでした。) いけなかったのはその後で、エディタの入っているフォルダをマイドキュメント以下に移動してしまったのです。 これにより、「プログラムから開く」一覧を生成する際に「参照先が存在しない」として表示されません。さらにまずいのは、エントリ自体はすでに存在するため、「参照」で移動先のプログラムを指定しても修正されず、結局、プログラムを参照できない状態に陥ったわけです。(試しに適当なフリーのエディタをDLし、実験してみてください。フォルダ名を変更するだけで発現します) この場合の解決策としては、HKLM\Software\Classes\Applications または HKU\...\Software\Classes\Applications 中の該当プログラムのエントリを一度削除します。その後、改めて「プログラムから開く」で移動先のプログラムを参照すれば、新規エントリとして正常に追加されます。 * 参考URL 2008年11月時点での参考URLです。 - Registry -- http://msdn.microsoft.com/en-us/library/ms724871%28VS.85%29.aspx - Registering File Extensions for Side-By-Side Deployments -- http://msdn.microsoft.com/ja-jp/library/bb166182.aspx - Extending Shortcut Menus -- http://msdn.microsoft.com/en-us/library/cc144101%28VS.85%29.aspx - Extending Shortcut Menus for a File Class -- http://msdn.microsoft.com/en-us/library/aa926808.aspx 記事作成当時は下記URLを参考にしたのですが、サイト構成などが変更されたようで、現在全てLOSTしています。 - Windows 2000 Registry -- http://msdn.microsoft.com/msdnmag/issues/1100/Registry/print.asp - Creating a File Association -- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fileassoc.asp - Extending Shortcut Menus -- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/context.asp