ファイル拡張子とプログラムの関連付け

Windows は 「最近使ったファイル (Recent files) リスト」や「よく使うファイル (Frequent files) リスト」を管理しています。 例えば「メモ帳」がテキストファイル (拡張子 .txt) と関連付いている場合、テキストファイルをダブルクリックして開くなどすると、 メモ帳の最近使ったファイルリストとして登録されます。

ファイル拡張子とプログラムの関連付け

最近使ったファイルリストやよく使うファイルリストにファイルが登録される詳しい条件は、当サイトの「最近使ったファイルとよく使うファイルリスト」 で説明してます。

自動的にファイルリストを管理するには、ファイルとプログラムの関連付けが必要ですが、 この資料ではファイルとプログラムの関連付け方法について説明します。

ファイル拡張子とプログラムの関連付けとは?

Windows の基本的な動きからみていきましょう。ちなみに、ここで使用しているのは Windows 7 の英語版です。

まず、デスクトップに foo.keicode というファイルがあったとします。

ファイル拡張子とプログラムの関連付け

拡張子は3文字でなくても構いません。ここで拡張子は .keicode です。

このファイルをダブルクリックします。すると、わけのわからないファイルタイプですから Windows が、 そんなファイルどうやって開けばいいか知りませんよ、と悲鳴(?)を上げて、次のようなダイアログを表示します。

ファイル拡張子とプログラムの関連付け

そこで、Windows にあらかじめこのファイルを開くといったら、このプログラムを起動するんですよ、と教えるのが ファイルの拡張子とプログラムの関連付けです。

レジストリの設定で拡張子とプログラムが関連付く

ここでは .keicode という拡張子に、自前のプログラムの jumplist1.exe (フルパスは C:\Temp\jumplist1.exe とします) という実行可能ファイルを関連付けする例を取って、 具体的に示します。

レジストリエディタを開きます。レジストリエディタはプログラム名を指定して実行 (Run...) に regedit と入力して Enter キーをたたけば起動します。

まず HKEY_CLASSES_ROOT\.keicode というキーを作成します。 そして、その下に OpenWithProgIds というキーを作成します。

このキーの下に「文字列値」として、KeicodeTest.JumpList.1 という名前の値を作ります。

ファイル拡張子とプログラムの関連付け

次に HKEY_CLASSES_ROOT\KeicodeTest.JumpList.1 というキーを作成して、 その下に shell キーを作り、その下に open キーを作り、 その下にさらに command キーを作ります。

command キーのデフォルト値として、起動するプログラムのフルパスを登録すれば OK です。

このスクリーンショットのようになれば OK です。

ファイル拡張子とプログラムの関連付け

この状態でプログラムを起動すると、command キーで指定したプログラムが起動するはずです。

上でなにを設定したのか? ProgID = プログラム識別子

上で指定した KeicodeTest.JumpList.1 は「プログラム識別子」と呼ばれるものです。 ProgID などともいいます。Windows ではプログラムを識別する時に、しばしばプログラム識別子を用います。

GUID のような世界中で一意になる値と異なり、プログラム識別子は通常簡単な文字列データなので一意にならずに他のプログラムとぶつかることもありますので、 自分でプログラム識別子を決めるときは注意して決める必要があります。

例えば、今回は当サイト (keicode.com) のテストプログラムなので、私は KeicodeTest という文字をプログラム識別子にいれました。

そして、プログラムのバージョン管理をするために、KeicodeTest.JumpList.1 という風に最後にドットで区切ってバージョン番号をいれました。 これはプログラム識別子でバージョンを書くときの慣例となっています。

ProgID のバージョン独立な設定方法

上で説明した方法ではプログラム識別子 KeicodeTest.JumpList.1 のもの、 すなわちバージョン 1 のものと拡張子が関連付いていました。

しかし、拡張子とプログラムの関連付けを行うときに、

「拡張子 .keicode のファイルは、プログラム識別子 KeicodeTest.JumpList.(バージョン) の現在のバージョンで開く」

という風に設定できれば便利ですよね。

ここではそうしたバージョンに独立した設定方法を示します。基本的な考え方は変わらないのですが、ProgID から実際のコマンドを探すために、ワンステップ増えます。

まず、HKCR\.keicode\OpenWithProgIds で指定する ProgID からバージョン情報を取ります。 具体的には KeicodeTest.JumpList とします。最後の .1 がなくなっていることに注意してください。

ファイル拡張子とプログラムの関連付け

次に HKEY_CLASSES_ROOT\KeicodeTest.JumpList キーを作り、その下に CurVer キーを作ります。CurVer には現在のバージョン (Current Version) の ProgID を設定します。

ファイル拡張子とプログラムの関連付け

このように設定すると、現在のバージョンの ProgID を探すことができ、そこから現在のバージョンのコマンドを取得できるようになります。

ファイル拡張子とプログラムの関連付け

尚、図中の HKCR というのはレジストリの HKEY_CLASSES_ROOT の略称です。

上記のように構成しておけば、KeicodeTest.JumpList.2 が出た場合に、 HKCR\.keicode のエントリはいじる必要がなく、HKCR\KeicodeTest.JumpList\CurVer の値を変更すればよいことになります。

ファイル拡張子とプログラムの関連付け

ファイル名をプログラムで受取る方法

上で説明した方法で、ファイルの拡張子とプログラムは関連付けることができます。 しかし、開くファイル名がプログラムに渡されていません。ファイル名をプログラムに渡すのは簡単です。

上記の shell\open\command でパスを登録するところで %1 をつけると、 コマンドラインパラメータとして、%1 の代わりにパス名が渡されます。

ファイル拡張子とプログラムの関連付け

尚、この書き方だと空白を含むパスの場合、プログラムの起動コマンドが

jumplist1.exe C:\Dir Name\file.keicode

となってしまい、プログラムからパス名が簡単に取れません。そこで、

jumplist1.exe "C:\Dir Name\file.keicode"

とするために、%1 を " で囲んでおくと良いです。

ファイル拡張子とプログラムの関連付け

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説