こんにちは、阿久津です。日頃から使用しているマシンでふと気付いたのが、ファイルのコンテキストメニューに並ぶ<プログラムから開く>→<既定のプログラムの選択>の異常動作。通常であれば、ポップアップが開き、「このファイルを開く方法を選んでください」というメッセージと共に、デスクトップアプリの選択を求められます(図01~02)。
Windows 7以前は「ファイルを開くプログラムの選択」ダイアログが現れますが、同メニューに並ぶ項目をOpenWithListキーの内容を整理した後に確認したところ、エラーダイアログが現れるようになりました。メッセージ内容は「指定されたファイルに対してこの操作を行うプログラムが関連付けられていません」というものです(図03)。
そもそも関連付けのロジックは、Windows Vistaから大きく変更されています。管理者と標準という各ユーザーグループの権限を明確化するため、ファイル(の拡張子)とプロトコルを同列に扱うなど、それまでとは構造が大きく異なる「既定のプログラム」を導入しました。例えばテキスト形式ファイルにデスクトップアプリを関連付ける場合、最初に管理者権限で実行中のインストーラーなどがレジストリ上で関連付けを操作する宣言を行い、その上で標準権限から実行中のアプリケーションがAPI経由で関連付けを行います。
例えば「秀丸」の場合、セットアップ時に関連付けの変更を行いますが、ここではHKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplicationsキーに、文字列値「HidemaruEditor」を新規作成し、値のデータとして「SOFTWARE\Hidemaruo\Hidemaru\Capabilities」を指定(図04)。
ここからHKEY_LOCAL_MACHINE\SOFTWARE\Hidemaruo\Hidemaru\Capabilitiesキーを参照させ、FileAssociationsキーでは各文字列値で関連付け設定を行います。秀丸が関連付けるのはファイルに限られるため、拡張子と対になるProgIDを値のデータに格納していますが、ネットワーク系アプリケーションの場合、プロトコルを関連付けるUrlAssociationsキーやMIMEAssociationsキーを作成し、同様のロジックでプロトコルの指定を行うことも(図05)。
図05 HKEY_LOCAL_MACHINE\SOFTWARE\Hidemaruo\Hidemaru\Capabilities\FileAssociationsキーで関連付け設定のベースが作成されます |
HKEY_LOCAL_MACHINE\SOFTWARE\Hidemaruo\Hidemaru\Capabilities\FileAssociationsキーでは、複数の拡張子が登録されましたが、テキスト形式ファイルの場合、HKEY_CLASSES_ROOT\.txtの既定値にProgIDを登録するという仕組み。このようにユーザー権限を厳しくするため、レジストリ構造まで変化しています(図06)。
さらに冒頭で述べた<既定のプログラムの選択>は、また異なる箇所で動作します。テキスト形式ファイルである拡張子「.txt」を例に述べますと、HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts.txtキーで管理され、OpenWithListキーに使用したアプリケーションを登録。同項目を開く際にOpenWithListキーを参照するのは、以前のWindows OSと同じ。HKEY_CLASSES_ROOT\.txt\OpenWithListキーなど、他のキーも参照されます(図07)。
蛇足ですが、OpenWithListキーを整理しても<プログラムから開く>には「メモ帳」「ワードパッド」など標準デスクトップアプリが残り、現時点では削除方法を確認できていません。また「秀丸」が残ってしまうのは、HKEY_CLASSES_ROOT\hidemaru.txt\shellキー下で関連付けを行っているためです。
さて、冒頭で述べた<プログラムから開く>→<既定のプログラムの選択>の異常動作ですが、その原因はHKEY_CLASSES_ROOT\Unknown\shell\OpenWithSetDefaultOnキーにあることがわかりました。そこで今週は<既定のプログラムの選択>で発生するエラーを修正するためのチューニングをお届けしましょう。
1. 管理者権限でレジストリエディターを起動します。
2. HKEY_CLASSES_ROOT\Unknown\shell\OpenWithSetDefaultOnキーを開きます。 3. 文字列値「ProgrammaticAccessOnly」を作成します。
4. 文字列値「MultiSelectModel」を作成し、値のデータを「Single」に変更します。
5. HKEY_CLASSES_ROOT\Unknown\shell\OpenWithSetDefaultOn\commandキーを開きます。
6. (既定)の値のデータを「%SystemRoot%\system32\OpenWith.exe -override "%1"」に変更します。
7. 文字列値「DelegateExecute」を作成し、値のデータを「{e44e9428-bdbc-4987-a099-40dc8fd255e7}」に変更します。
8. [F5]キーを押してから レジストリエディターを終了させます。
これでチューニングが完了しました(図08~21)。
図16 commandキーの「(既定)」をダブルクリックし、値のデータを「%SystemRoot%\system32\OpenWith.exe -override "%1"」に変更して<OK>ボタンをクリックします |
図19 文字列値「DelegateExecute」をダブルクリックで開き、愛のデータを「{e44e9428-bdbc-4987-a099-40dc8fd255e7}」に変更して<OK>ボタンをクリックします |
それでは結果を確認してみましょう。任意のファイルを右クリックし、メニューから<プログラムから開く>→<既定のプログラムの選択>とクリックしますと、図03のようなエラーダイアログは現れず、図02のようなポップアップが現れるようになります。
そもそもHKEY_CLASSES_ROOT\Unknownキーは、関連付けのないファイルが参照するエントリを格納していますが、サブキーとなるHKEY_CLASSES_ROOT\Unknown\shell\OpenWithSetDefaultOnキーでは、関連付けを変更する「OpenWith.exe」を実行する仕組み。筆者の環境では、何らかの理由でこのエントリが丸ごと削除されていたため、冒頭のエラーダイアログが現れていたようです。
ちなみに、HKEY_CLASSES_ROOT\Unknown\shell\OpenWithSetDefaultOn\commandキーの(既定)は展開可能な文字列値ですが、レジストリエディターではデータの種類を変更できません(reg.exeでキーを新規作成する場合は可能)。筆者はcommandキーもなかったため、文字列値として作成しましたが、特に大きな問題は発生していません。
なお、今回はトラブルシューティングですので、同様のトラブルに見舞われた方のみお試しください。正しく動作している場合、レジストリを編集するメリットはありません。
それでは、また次号でお目にかかりましょう。
阿久津良和(Cactus)