Windows Vista/7で用いられたファイル関連付けの仕組みを知る

文●塩田紳二 編集● ASCII.jp

2016年07月31日 10時00分

さて今回は、Windows Vistaで導入された関連付けの方法をみていくことにする。この方式は、VistaおよびWindows 7で利用されており、基本的には、XP方式を拡張した方式だ。

なお、Vistaのドキュメントによると、関連付けをアプリから行なうには、インストーラー内で管理者権限を使ってレジストリにアプリを登録し、その後、アプリがユーザー権限でAPIを呼び出して登録を行うとされている。

このため、以下の方法とは別に「プログラムから開く」→「規定のプログラムの選択」にアプリを「推奨されたプログラム」として表示させるレジストリ設定などが別途定義されている。これはセキュリティを高め、勝手にアプリを実行させる悪意のあるプログラムへの対策と思われる。

ただし、今回は、データファイルからアプリを起動することに関わる部分のみを解説する。また確認は、Windows 7で行なっているため、オリジナルのVistaと少し違う部分があるかもしれない。

以下の説明では、以下のファイルを登録する場合を考える

datafile.[拡張子]

ファイルの関連付けは、アプリ自身がレジストリに登録を行なうのが通常だが、ファイルをダウンロードしてきたなどでユーザーが未登録の拡張子を開こうとすることも考えられる。WindowsVista/7で未登録の拡張子を持つファイルは白紙のアイコンで表示される。

Windows 7では、未定義の拡張子のファイルは、白紙のアイコンで表示される

このファイルを開こうとすると、対応するアプリが不明であるとダイアログボックスが表示される。

未定義の拡張子のファイルを開こうとすると、アプリが登録されていないため、検索するか、自分で指定するかの選択肢があるダイアログボックスが表示される

ここで「インストールされたプログラムの一覧からプログラムを選択する」を選ぶと、「ファイルを開くプログラムの選択」ダイアログが表示される。

自分で指定する場合、アプリを選択し、説明を入力できる

ここで、適当なプログラムを選択して、「このファイルの種類の説明の入力」に説明文を入れることができる。このダイアログをOKで閉じると、エクスプローラーのファイル表示が変わる。このときのアイコンは、白紙のアイコンに指定されたアプリのアイコンが乗ったものになる。

拡張子に対してアプリケーションを定義してやると、白紙アイコンの上にアプリアイコンが乗ったものに変更になる

この操作でレジストリが以下のように設定される

HKEY_CLASSES_ROOT\.[拡張子]
@=[拡張子]_auto_file
HKEY_CLASSES_ROOT\[拡張子]_auto_file\
@=[説明文字列]
shell\
edit\command\
@="[実行プログラム] %1"
open\command\
@="[実行プログラム] %1"

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.[拡張子]
OpenWithList
a="[実行プログラム]"
MRUList="a"
OpenWithProgids
[拡張子]_auto_file=

このVista方式は、XP方式を含んでいるので、拡張子キー(HKEY_CLASSES_ROOT\.[拡張子]形式のキー)やファイルタイプキー(同HKEY_CLASSES_ROOT\[拡張子]_auto_file\)しか見ないアプリがあったとしても、問題は起きない。また、この方法で登録した場合にassoc/ftypeコマンドは関連付けを認識する。

なお、古いやり方、つまり拡張子キーとファイルタイプキー(あるいはPorgIDキー)しか設定しない場合、拡張子は認識されるが、GUIでデフォルトアプリケーションを見ると、アプリケーションは不明なままになり、データファイルからデフォルトアプリケーションを起動することはできない。

つまり、Windows Vista/7でデータファイルから起動する場合には、「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.[拡張子]」(以下エクスプローラー拡張子キーと呼ぶ)の設定は必須となる。XP形式のレジストリは、互換性のために作られ、最初にGUI設定で作られたあと、GUI側で他のアプリに変更しても、XP形式側にあったshellサブキー以下の指定方法は、変更されず、最初に設定したままになるようだ。

エクスプローラー拡張子キーには、以下の3つのサブキーがある。

OpenWithList
OpenWithProgids
UserChoice

「UserChoice」は、拡張子に対するデフォルトアプリを指定する。指定はprogidアイテムに対して、文字列(REG_SZ)でファイルタイプ/ProgIDのキーを指定する。ただし、手動で最初に拡張子を登録した場合、このUserChoiceは作られず、登録後に、GUIで起動プログラムを変更した場合に作られるようだ。

このProgIDの指定では、「HKEY_CLASSES_ROOT\」は省略される。ProgIDの一部には、「HKEY_CLASSES_ROOT」の下にある「Applications」サブキー以下に実行ファイル名の形、つまり

HKEY_CLASSES_ROOT\Applications\[実行ファイル名」
(例:HKEY_CLASSES_ROOT\Applications\notepad.exe)

として作られるものがある。標準添付のデスクトップアプリなどは、ほとんどここに定義してある。この場合、「UserChoice」サブキーのprogidアイテムには、「Applications\netepad.exe」などとして登録される。

「OpenWithList」サブキーは、エクスプローラーの右クリックメニューにある「プログラムから開く」で利用されるキーで、過去にデフォルト起動プログラムとして登録されたアプリが登録されていく。登録は、アルファベット1文字のサブキーと、その順番を示すMRUListサブキーの組み合わせからなる。

アルファベット1文字の名前を持つ文字列値(REG_SZ)アイテムは、個々のアプリに対応し、データとして起動コマンドラインが定義される。MRUListは、アイテムの名前を最近の利用順に並べたものだ。具体的には、以下のような感じになる。

OpenWithList\
a=プログラム名1
b=プログラム名2
c=プログラム名3
:
e=プログラム名n
MRUList=adecb

ユーザーが「プログラムから開く」でアプリを選択すると、そのアプリに対応するアルファベットがMRUListアイテム内で先頭に来るようになる。こうしていくと、MRUListは、先頭から最近の実行順序を記録するようになる。MRUListとは「Most Recent Used List」(最も最近使われた項目のリスト)という意味だと思われる。ここは、Windowsが管理する領域となるため、通常は触る必要はない。

「OpenWithProgids」は、既定値でファイルタイプまたはProgIDキーを指定している。ただし、この部分が使われるかどうかは、UserChoiceの指定の有無と内容で変化するようだ。ある意味、互換性を保つための機構のようだ。

UserChoiceサブキーがない場合、このキーによる指定が有効になる。また、UserChoiceサブキーがある場合、UserChoiceで指定されたProgIDとOpenWithProgidsで指定されたProgidキーが指定する実行プログラムが同一である場合(キーとしては別でもかまわないようだ)、OpenWithProgidsサブキーの既定値で指定しているProgID内の指定が有効になる。

ただし、OpenWithProgidsで指定されたProgIDキー側には、shellサブキーで実行プログラムが指定されていなければ、同一判定ができないため、OpenWithProgids側の指定は無効になる。Vista方式の具体的な登録例が以下のリストだ。

[HKEY_CLASSES_ROOT\.genko]
@="genko_auto_file"

[HKEY_CLASSES_ROOT\genko_auto_file]
@="説明を追加するとレジストリにはいる"
[HKEY_CLASSES_ROOT\genko_auto_file\shell]
[HKEY_CLASSES_ROOT\genko_auto_file\shell\edit]
[HKEY_CLASSES_ROOT\genko_auto_file\shell\edit\command]
@="%SystemRoot%\system32\NOTEPAD.EXE %1"

[HKEY_CLASSES_ROOT\genko_auto_file\shell\open]
[HKEY_CLASSES_ROOT\genko_auto_file\shell\open\command]
@="%SystemRoot%\system32\NOTEPAD.EXE %1"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.genko\OpenWithList]
"a"="NOTEPAD.EXE"
"MRUList"="ab"
"b"="WORDPAD.EXE"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.genko\OpenWithProgids]
"genko_auto_file"=hex(0):

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.genko\UserChoice]
"Progid"="Applications\\NOTEPAD.EXE"

注:リスト中「=hex(0):」は、アイテムの種類がREG_NONEであることを表す

次回は、Windows 8方式を解説し、Windows10での具体的な動作(各方式の優先順位など)を解説する予定だ。

■関連記事