拡張子の関連付け [日記]
Windowsでは、ファイルの拡張子に、そのファイルを処理するコマンドが関連付けられています。
ですが、関連付けられているコマンドを取得したり、逆に拡張子にコマンドを関連付けたりするAPIが無かったような気がします。
ではどうするかというと、レジストリを直接操作するしかなかったり。
そこで、拡張子から関連付けられているコマンドが決定するまでの流れを調べてみました。
"XXX"という拡張子を例とします。
(1)
次のレジストリキーを探す。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.XXX (XXXの前に「.」(ピリオド)がある)
キーが存在していれば、(2)へ。
存在しなければ、(6)へ。
(2)
(1)のレジストリキーに、
値フィールド「Application
」があれば(3)へ。
値フィールド「Progid
」があれば(4)へ。
どちらも無ければ(5)へ。
(3)
(2)の値フィールド「Application
」の値を取得する。
この値を仮に "YYY" とする。
次のレジストリキーを探す。
HKEY_CLASSES_ROOT\Applications\YYY\shell
キーが存在しなければ、関連付けられているコマンドは存在しない。
キーが存在していれば、このレジストリキー(仮に"{SHELL}"と呼ぶ)に対して「※」の処理へ。
(4)
(2)の値フィールド「Progid
」の値を取得する。
この値を仮に "ZZZ" とする。
次のレジストリキーを探す。
HKEY_CLASSES_ROOT\ZZZ\shell
キーが存在しなければ、関連付けられているコマンドは存在しない。
キーが存在していれば、このレジストリキー(仮に"{SHELL}"と呼ぶ)に対して「※」の処理へ。
(5)
次のレジストリキーを探す。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.XXX\OpenWithProgids (XXXの前に「.」(ピリオド)がある)
キーが存在しなければ、関連付けられているコマンドは存在しない。
このレジストリキーに存在する値フィールドを探す。
値フィールドが0個の時は、関連付けられているコマンドは存在しない。
値フィールドが2個以上ある時は、そのうちのどれかが選ばれる。どれが選ばれるのかは不明。
この時の値フィールドの名前を仮に "ZZZ" とする。
次のレジストリキーを探す。
HKEY_CLASSES_ROOT\ZZZ\shell
キーが存在しなければ、関連付けられているコマンドは存在しない。
キーが存在していれば、このレジストリキー(仮に"{SHELL}"と呼ぶ)に対して「※」の処理へ。
(6)
次のレジストリキーを探す。
HKEY_CLASSES_ROOT\.XXX (XXXの前に「.」(ピリオド)がある)
キーが存在しなければ、関連付けられているコマンドは存在しない。
キーが存在していれば、このきーの値を取得する。
このレジストリキーの値を仮に "WWW" とする。
次のレジストリキーを探す。
HKEY_CLASSES_ROOT\WWW\shell
キーが存在しなければ、関連付けられているコマンドは存在しない。
キーが存在していれば、このレジストリキー(仮に"{SHELL}"と呼ぶ)に対して「※」の処理へ。
※
レジストリキー {SHELL} の値を取得する。
このレジストリキーの値を仮に "AAA" とする。
キー {SHELL} に値が設定されていなければ(AAA が空だったら)、AAA は "open" となる。
次のレジストリキーを探す。
{SHELL}\AAA\command
このキーの値が、拡張子に関連付けられたコマンドである。
ただし、
キーが存在しない or 上記キーの値で指定されているコマンドが存在しない場合、 関連付けられたコマンドが見つかるか、サブキーの候補がなくなるまで繰り返される。
キー {SHELL} のサブキーのうち、まだ調べていないキーを見つける。仮に "BBB"とする。
どの順番で選ばれるかは不明。ただし open
が優先になっているっぽい。
{SHELL}\BBB\command
が関連付けられたコマンド
以上
実際にレジストリを弄りながら試した結果なので、正確なところは不明です。
MDSNのどこかに、正式なものの記述でもあれば良いけど
Windows XPで確認してますけど、多分2000でも同じ筈です。
(今更必要あるか謎だけど)Win98は(6)だけです。
(1)~(5)は、ファイルを右クリックして「プログラムの選択」を選んだ時の設定です。
(6)が、エクスプローラのメニューで[ツール]-[フォルダ オプション]を選んで「ファイルの種類」で設定した時の情報です。
今日の一冊 | |
|
コメント 0