Windows Vista 既定のプログラム 関連付け レジストリ とかの話

Vista関連付けはXPと激しく違います。Vistaでは、
  1. まず管理者権限のあるプログラム(インストーラなど)でレジストリを操作して、どの関連づけを扱えるかを宣言して
  2. 次に管理者権限のないプログラム(アプリケーション本体など)でAPIを呼び出し、実際の関連付けを行う
という手順になります。2の操作はユーザが[スタート]-[既定のプログラム]で直接行うこともできます。

具体的な説明は下記のページの「既定のプログラム」という節にあります。
ページ1

関連付け関連のレジストリ
Capabilities とか FileAssociations とか URLAssociations とか StartMenuInternet とか Mailto とか

レジストリの内容もXPと激しく違います。

上のページ1に書いてありますが、読んでも、いろいろなレジストリキーがあって全体のつながりがさっぱりわからなくないですか? 私はわからなかったです。

いろいろ調べて、全体のつながりをまとめた絵を描きましたので、概要の理解にお役立てください。実際の値とかについてはVistaでレジストリエディタで適当なソフトのを見てみてください。





「既定のプログラム」APIの呼び出し方(VS2005 VC++)
SHObjIdl.h とか IApplicationAssociationRegistration とか

上のレジストリを登録すれば、あとはAPIで、関連付けするプログラムを選択できます。
HKLM¥SOFTWARE¥RegisteredApplications の下のデータの名前(上の図の「根っこ」のところの赤下線を引いたところに書いた名前)をAPIで指定すれば、それが特定の拡張子に関連付けされているか調べたり、関連付けを変えたりできます。

このAPIは管理者権限がない一般のアプリからでも呼べます。というか一般のアプリから呼ぶべきです。管理者権限を設定したインストーラーなどからAPIを呼んでしまうと、そのプログラムから見えるカレントユーザーは管理者になってしまうので、管理者でないユーザーの関連付けを設定できません(Vistaでは関連付けはユーザーごとの設定になっています)。

APIは上のページ1の真ん中へんに紹介されています。IApplicationAssociationRegistrationなどの名前のやつです。API自体は簡単なんですが、これを呼ぶには
・Vista対応のWindows SDK (こちらから入手できます)をインストールして、
・スタートメニューにできたWindows SDKメニューから「Visual Studio Registration」を呼び出してVS2005に組み込んで
・WINVER や _WIN32_WINNT プリプロセッサ変数でVista用(0x0600)を指定した上で
#include "SHObjIdl.h" してやる必要があります。

しかし、既存のプロジェクトのプリプロセッサ変数を変えてしまうと、APIパラメータの構造体が勝手に大きくなったりして、なかなかみつからないいやらしい不具合がプログラムのどこかすみっこのあたりでたぶん発生しますので注意が必要です(私は今回はやってないですが以前XPへの移行時にどつぼにはまってしまい懲りました)。

Windows8についての追記
IApplicationAssociationRegistration はお亡くなりになりました

Windows8では関連付けを調べたり変えたりするAPIは効かなくなりました。レジストリを登録したあとは、IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUIでOSの関連付けウィンドウを呼び出してユーザに操作してもらえということのようです。

http://msdn.microsoft.com/en-us/library/windows/desktop/cc144154(v=vs.85).aspx


2006/12/30  Daytime
2007/07/14 図を清書/リンク先を日本語ページに変更    
2013/02/27 Windows8について追記