ここでは、RALを用いた関連付け機能の利用方法等に触れます。
Windows 95やWindows NTでは、拡張子へのアプリケーション関連付け情報をレジストリに格納するようになっています。関連付けには多くの情報が盛り込まれておりますが、RALでその設定等を操作できるようになっています。まずは関連付けのメカニズムについてから始めます。
関連付け情報の種類
レジストリに格納される関連付け情報には種類があります。関連付けすることによって出来ることを以下に挙げてみます。
1.起動するアプリケーションの指定
2.表示アイコンの指定
3.ドキュメントタイプの指定
4.とるべき動作の指定
5.新規ドキュメントの指定
おおよそこんなところでしょうか。
1.起動するアプリケーションの指定が行われている場合は、エクスプローラでファイルをダブルクリックすると、関連付けられたアプリケーションを起動します。
2.表示アイコンの指定が行われている場合、エクスプローラでは各ファイルごとに指定されているアイコンを表示します。
3.ドキュメントタイプの指定が行われている場合、エクスプローラを詳細表示にした時に、エクスプローラウィンドウ右側にある「ファイルの種類」の欄へ指定された内容が表示されます。
4.とるべき動作の指定が行われている場合、エクスプローラでファイルをダブルクリックすると、ここで指定された動作をします。指定出来る動作には、「開く」「印刷」等があります。
5.新規ドキュメントの指定が行われている場合、マウスで右クリックした時に表示されるメニューより「新規作成」を選択することで新規にファイルが作成されます。例えば、デスクトップ上でマウスの右クリックメニューから「新規作成」を選択すると、デスクトップにファイルが作成されます。
このようなことを可能にするためにRALに関連付け機能を実装しています。
関連付け情報は、レジストリのHKEY_CLASSES_ROOTハイブに全て存在しています。試しに、レジストリエディタでHKEY_CLASSES_ROOTのツリーを展開表示するとかなりの数のキー階層が存在していると思います。これらは主に、関連付け情報やOLE/ActiveXに関する情報を表しています。
関連付けに使用されるメカニズムは1つではありませんが、RALでは最も簡単な方法による関連付け機能を提供しています。関連付けには、コマンドライン指定による方法とDDE(Dynamic Data Exchange)による方法とがあり、RALではコマンドライン指定による方法を用いています。
関連付けは、ファイルの拡張子単位で行われます。以下では、具体例を挙げてRALが用いている関連付けのメカニズムを説明します。
拡張子と関連付け情報
拡張子.abcにメモ帳を関連付ける場合を考えてみます。HKEY_CLASSES_ROOTハイブにまずは関連付けを行う拡張子の情報が必要になります。拡張子の情報はHKEY_CLASSES_ROOTハイブ直下に拡張子名のキーを用意することで表します。拡張子キーにはピリオドを含めます。
HKEY_CLASSES_ROOT
+---.abc
拡張子キーを作成したらその傘下に関連付け情報の参照先を格納します。ここでは例として以下のようにします。
HKEY_CLASSES_ROOT
+---.abc
(標準) "abcfile"
.abcキーに(標準)という項目があるはずなので、その内容を上記のようにabcfileに変更します。このabcfileが何を示しているかというと、拡張子.abcの関連付け情報の実際の在処です。つまり関連付け情報は.abcキーの傘下ではなく別の場所に用意する必要があります。このabcfileをアプリケーション情報キーと呼ぶことにします。
それでは次に実際の関連付け情報を用意します。これもHKEY_CLASSES_ROOTハイブ直下に用意します。先ほど.abcキー傘下に指定したabcfileをキー名にします。拡張子キーとアプリケーション情報キーは関連付けに必須です。
HKEY_CLASSES_ROOT
+---.abc
| (標準) "abcfile" -----+
| | HKEY_CLASSES_ROOT\abcfileを指している
+---abcfile <----+
つまり.abc傘下のabcfileは、拡張子.abcの関連付け情報がHKEY_CLASSES_ROOT\abcfileにあることを示していることになります。それではabcfile傘下に実際の関連付け情報を格納してみます。ここに格納されるべき情報には起動するアプリケーションの指定、アイコンの指定、ドキュメントタイプの指定、動詞の指定、関連付けメカニズムの指定があります。
アイコン
まずはアイコンを指定してみます。表示させたいアイコンはabcfile直下にDefaultIconキーを作成することで指定します。
HKEY_CLASSES_ROOT
+---.abc
| (標準) "abcfile"
|
+---abcfile
+---DefaultIcon <----- 表示させるアイコン情報の在処
(標準) "c:\windows\notepad.exe,0"
すぐに判るかと思いますが、DefaultIconキーの(標準)項目に表示するアイコンを内蔵しているファイルを指定します。exeファイル以外にもdllファイル等も指定できます。更にアイコンを内蔵しているファイルに続いてカンマで区切られた数字があります。この数字は指定されたアイコン内蔵ファイル中で何番目のアイコンを表示するかを表しています。exeファイルやdllファイルは複数のアイコンを内蔵できるのでこのような指定が存在します。空白などをあけずにカンマで区切って0から始まる数字を指定します。0を指定すると一番最初のアイコンを表示するようになり、1を指定すると2番目、2を指定すると3番目...となります。ここの例にあるメモ帳は2つのアイコンを内蔵しているので0か1が指定できます。
アイコンの指定は必須ではありません。エクスプローラはアイコン指定が省略されている場合に、Windowsが最初から持っているデフォルトのアイコンを表示します。このデフォルトのアイコンはWindowsのsystemディレクトリ傘下にあるshell32.dllが内蔵しているモノです。
ドキュメントタイプと動詞
次にドキュメントタイプの指定を行います。ドキュメントタイプとは、エクスプローラを詳細表示にした時に、エクスプローラのウィンドウ右側にある「ファイルの種類」の欄に表示される内容のことです。これはabcfileキーの(標準)項目で指定します。例えば「ABCドキュメント」としてみます。
HKEY_CLASSES_ROOT
+---.abc
| (標準) "abcfile"
|
+---abcfile
| (標準) "ABCドキュメント" <----- ドキュメントタイプ
+---DefaultIcon
(標準) "c:\windows\notepad.exe,0"
今度はとるべき動作の指定です。とるべき動作とは、その拡張子を持つファイルをどのようにするかを意味します。エクスプローラからファイルをダブルクリックした場合は通常ですとアプリケーションが起動してそのファイルを開いてくれます。これは「開く」という動作が関連付け情報として指定されているためです。他の例ですと「印刷する」が挙げられます。特にワードプロセッサのアプリケーションがインストールされていれば、そのワードプロセッサの文書ファイルの拡張子には「印刷する」という動作が関連付け情報としてレジストリに格納されていることが多いと思います。これはエクスプローラでそのワードプロセッサの文書ファイルを右クリックすることで確認できます。右クリック時に表示されるメニューに印刷の項目があれば、動作として印刷がレジストリ中に存在することになります。このような動作を表すキーワードを動詞と呼びます。
ここでは通常の「開く」という動詞を指定することにします。動詞はabcfile傘下にshellキーを作成し、更にshellキー傘下に動詞のキーを作成することで表します。
HKEY_CLASSES_ROOT
+---.abc
| (標準) "abcfile"
|
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open <----- 「開く」という動詞を指定
エクスプローラでファイルをダブルクリックした時にそのファイルをアプリケーションが開くようにするには「開く」という動詞としてopenというキーを用意します。「開く」以外にも動詞を指定するのであればshellキー傘下にいくつでもキーを作成できます。例えば印刷を動詞として指定するにはprint等のキーワードでキーを用意します。
エクスプローラはドキュメントタイプが省略されている場合に「〜ファイル」と表示します。例えばabcファイル等です。また動詞が指定されていなければ、エクスプローラからダブルクリック時に「ファイルを開くアプリケーションの選択」というタイトルのダイアログが表示されます。
コマンドラインとメニュー項目
動詞を指定したので今度はその動詞に対するアプリケーションを指定します。ここでは「開く」という動詞を指定したので、ファイルを開くアプリケーションを指定します。アプリケーションの指定は動詞を表すキー傘下にcommandキーを作成することで行います。
HKEY_CLASSES_ROOT
+---.abc
| (標準) "abcfile"
|
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open
+---command
(標準) "c:\windows\notepad.exe "%1"" <----- アプリケーションの指定
アプリケーションの指定は上記のようにコマンドラインで指定します。%1の部分は実際にはファイル名に置き換わります。例えばc:\test.abcをエクスプローラでダブルクリックすると
c:\windows\notepad.exe "c:\test.abc"
実際にはこのようなコマンドラインになります。ファイル名に置き換わる%1はダブルコーテーションで括るようにしてください。ダブルコーテーションで括ることで、空白を含むファイル名でも正しく扱われるようになります。またコマンドラインには必要に応じてコマンドラインオプション等も自由に指定して構いません。
動詞に対してコマンドラインを指定したついでに、その動詞に対応するメニュー項目文字列も指定してみます。メニュー項目文字列とはエクスプローラ上でのファイル右クリック時に現れるメニューに表示される内容です。「開く(O)」や「印刷(P)」等といった、メニュー項目の内容です。これは動詞を表すキーの(標準)項目で指定します。
HKEY_CLASSES_ROOT
+---.abc
| (標準) "abcfile"
|
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open
| (標準) "開く(&O)" <----- メニュー項目文字列
+---command
(標準) "c:\windows\notepad.exe "%1""
ここでは"開く(&O)"を指定しています。&を指定しているのは、その直後の文字にアンダーラインを表示させるためです。メニュー項目中でアンダーラインが付いている文字は、その文字のキーを押下することでそのメニュー項目を選択したことにできます。これをニーモニックと呼んでいます。ニーモニックには半角の英数記号を指定できます。全角文字には指定できません。この例ではニーモニックとしてアルファベットのOを指定しているので、メニューが表示されているときにOのキーを押下すれば「開く(O)」のメニュー項目を選択することが出来ます。もちろん普通にマウスで選択したりカーソルキーを使って選択しても構いません。
エクスプローラはメニュー項目文字列が省略されている場合に「開く(O)」を表示します。
新規ドキュメント
最後に新規ドキュメントの指定を行います。新規ドキュメントとは、エクスプローラのウィンドウ右側やデスクトップで右クリック時に表示されるメニューから「新規作成」を選択した場合にそこに作成される新規ドキュメントファイルです。新規ドキュメントを関連付け情報としてレジストリに格納するに先立って、新規作成状態のファイルを予めディスク上に用意しておく必要があります。関連付け情報での新規ドキュメントは、この新規ドキュメントファイル名を指定することによって行います。新規状態のドキュメントファイルを用意したら、そのファイル名を拡張子キー傘下のShellNewキーにて指定します。
HKEY_CLASSES_ROOT
+---.abc
| | (標準) "abcfile"
| +---ShellNew
| FileName "c:\null.abc" <----- 新規ドキュメントファイル名
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open
| (標準) "開く(&O)"
+---command
(標準) "c:\windows\notepad.exe "%1""
新規ドキュメントファイル名は拡張子キー傘下にShellNewキーを作成し、更にその傘下にFileNameという項目を作成してそこに格納します。今までのように(標準)項目ではないので注意して下さい。エクスプローラのウィンドウ右側やデスクトップで「新規作成」を選択した場合には、新規ドキュメントファイル名で指定したファイルがフォルダやデスクトップにコピーされてきます。またメニューから「新規作成」を選択した際には新規作成が可能なドキュメントタイプ一覧が更にメニューで表示されますが、この時に新規作成可能なドキュメントの種類としてドキュメントタイプが使用されるようになっています。
新規ドキュメントファイル名は必須ではありません。新規ドキュメントファイル名が省略されているか、またはドキュメントタイプが省略されている場合には右クリック時に表示されるメニューからの新規作成は出来なくなります。
その他の新規ドキュメント
先に説明した新規ドキュメントの指定方法はドキュメントテンプレートを利用するモノです。ドキュメントテンプレートを使用する方法以外にも新規ドキュメントを指定する方法があります。1つは空ドキュメントを指定する方法、次にバイナリデータを指定する方法、最後にプログラムを指定する方法です。
空のドキュメントを指定する方法は、テキストベースのドキュメントの場合によく利用されます。この方法を指定した場合はフォルダやデスクトップで新規作成を選択した時に空のファイル(サイズが0のファイル)が作成されます。空のドキュメントを指定するにはShellNewキー傘下にNullFile項目を用意することで行います。
HKEY_CLASSES_ROOT
+---.abc
| | (標準) "abcfile"
| +---ShellNew
| NullFile "" <----- 空のドキュメントを指定
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open
| (標準) "開く(&O)"
+---command
(標準) "c:\windows\notepad.exe "%1""
作成される新規ドキュメントに一定の内容が必要であればバイナリデータを指定する方法が使用できます。バイナリデータを指定した場合は新規作成されたドキュメントの内容が指定されたバイナリデータになります。従って新規作成されたファイルのサイズは指定したバイナリデータのサイズと同じになります。バイナリデータを指定するにはShellNewキー傘下にData項目を用意します。
HKEY_CLASSES_ROOT
+---.abc
| | (標準) "abcfile"
| +---ShellNew
| Data 00 01 02 03 04 05... <----- バイナリデータを指定
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open
| (標準) "開く(&O)"
+---command
(標準) "c:\windows\notepad.exe "%1""
プログラムを指定する方法はウィザードを実行したい場合によく利用されます。プログラムを指定すると新規作成が選択された時に指定されたプログラムが起動されます。プログラムを指定するにはShellNewキー傘下にCommand項目を用意し、コマンドラインを指定します。
HKEY_CLASSES_ROOT
+---.abc
| | (標準) "abcfile"
| +---ShellNew
| Command "c:\wizard.exe" <----- プログラムのコマンドライン
+---abcfile
| (標準) "ABCドキュメント"
+---DefaultIcon
| (標準) "c:\windows\notepad.exe,0"
+---shell
+---open
| (標準) "開く(&O)"
+---command
(標準) "c:\windows\notepad.exe "%1""
関連付け手順
関連付けを行うために必要となる手順をまとめます。
1.拡張子キーを作成する
2.アプリケーション情報キーを作成する
3.ドキュメントタイプを指定する
4.DefaultIconキーを作成してアイコンを指定する
5.shellキーと動詞を示すキーを作成する
6.commandキーを作成してコマンドラインを指定する
7.メニュー項目文字列を指定する
8.拡張子キーがアプリケーション情報キーを指すようにする
9.ShellNewキーを作成して新規ドキュメントファイル名を指定する
これらの操作に対応するRALのAPIを説明します。
1.の拡張子キーを作成するにはRalCreateExtensionを使用します。RalCreateExtensionをコールしたら次にRalCreateItemを使用します。RalCreateItemで2.〜7.までを行います。ここまでの時点で拡張子キー、アプリケーション情報キー及びその傘下の情報は準備されています。しかし、拡張子キーがまだアプリケーション情報キーを指すようになっていません。拡張子キーがアプリケーション情報キーを指すようにするにはRalAttachを使用します。RalAttachをコールすることで拡張子キーがアプリケーション情報キーを指すようになります。これが8.にあたります。最後に9.の新規ドキュメントファイル名を指定するにはRalAttachNewFileを使用します。RalAttachNewFileをコールすることで既に作成されている関連付け情報に新規ドキュメントファイル名の情報を追加出来ます。
また1.〜8.を一度に行うためにRalAssociateを使用することも出来ます。RalAssociateをコールすることで上記手順の1.〜8.をまとめて行うことが出来ます。RalAssociateをコールした後に必要に応じてRalAttachNewFileをコールします。
まったく別の方法としてプログラムが関連付けを行うのではなく、ユーザインタフェースによりユーザに関連付けを行わせることも出来ます。ユーザインタフェースとしてRALは関連付け用にダイアログを実装しています。このダイアログはRalAssociateDlgで表示できます。RalAssociateDlgはコモンダイアログのように構造体ポインタによって呼び出し側とインタフェースをとります。またこのRalAssociateDlgのコールを簡略化するためのAPIとしてRalApplyも利用できます。関連付けをユーザに行わせるにはRalApplyを使用するのが最も簡単な方法です。
関連付けの解除
今度は逆に関連付けの解除について触れます。関連付けの解除は関連付け情報をレジストリから削除することで可能です。拡張子、アプリケーション情報キーの削除にはそれぞれRalDeleteExtension、RalDeleteItemを使用します。また一時的に解除するだけであればRalDetachを使用することが出来ます。RalDetachは拡張子キー傘下の(標準)項目の内容をクリアします。つまりRalDetachはRalAttachの逆を行います。これにより拡張子キーがアプリケーション情報キーを指さなくなるので、事実上関連付けが解除されたことになります。
関連付けのサンプル
以下に今までの説明で使用してきた関連付けの例を実際にRALのAPIで行うためのコードを示します。
// 拡張子キーを作成
if( !RalCreateExtension( ".abc" ) )
{
// エラー処理
}// アプリケーション情報キーとその傘下の情報を作成
if( !RalCreateItem( "abcfile", // アプリケーション情報キー名
"ABCドキュメント", // ドキュメントタイプ
"open", // 動詞
"開く(&O)", // メニュー項目文字列
"c:\\windows\\notepad.exe", // コマンドライン
"c:\\windows\\notepad.exe", // アイコンパス
0 ) ) // アイコンインデクス
{
// エラー処理
}// 拡張子キーがアプリケーション情報キーを指すようにします
if( !RalAttach( ".abc", "abcfile" ) )
{
// エラー処理
}// 必要なら新規ドキュメントファイル名を指定します
if( !RalAttachNewFile( ".abc", "c:\\test.abc" ) )
{
// エラー処理
}
上記のサンプルコードの代わりに以下のコードでも同じことが出来ます。
// 一度に関連付け
if( !RalAssociate( ".abc", // 拡張子
"abcfile", // アプリケーション情報キー名
"ABCドキュメント", // ドキュメントタイプ
"open", // 動詞
"開く(&O)", // メニュー項目文字列
"c:\\windows\\notepad.exe", // コマンドライン
"c:\\windows\\notepad.exe", // アイコンパス
0 ) ) // アイコンインデクス
{
// エラー処理
}// 必要なら新規ドキュメントファイル名を指定します
if( !RalAttachNewFile( RANF_TEMPLATE, ".abc", szTemplateFilename, sizeof( szTemplateFilename ) ) )
{
// エラー処理
}
既に.abcの関連付けが行われている場合に、更に.defにも.abcと同じ関連付けを行うには以下のようにします。
// 拡張子を作成
if( !RalCreateExtension( ".def" ) )
{
// エラー処理
}// 拡張子キーがアプリケーション情報キーを指すようにします
if( !RalAttach( ".def", "abcfile" ) )
{
// エラー処理
}
この例では拡張子.defのキーを作成し、既に存在しているアプリケーション情報キーabcfileを指すようにしています。
関連付けダイアログを表示するコード例を示します。
RALASSOCIATESTRUCT Associate; // RalAssociateDlg用構造体
// 構造体をゼロクリア
ZeroMemory( &Associate, sizeof( Associate ) );// ダイアログのオーナウィンドウをセット
Associate.hWndOwner = hWnd;// 詳細表示型の関連付けダイアログを表示
RalAssociateDlg( &Associate );// 構造表示型を指定するオプション
Associate.dwOption = RAD_SHOWHIERARCHY;// 構造表示型の関連付けダイアログを表示
RalAssociateDlg( &Associate );
構造体によって情報の受け渡しを行う上記のコードの代わりに、以下の簡易インタフェースも利用できます。
// 詳細表示型の関連付けダイアログを表示
RalApply( RA_ASSOCIATE, hWnd, NULL );// 構造表示型の関連付けダイアログを表示
RalApply( RA_ASSOCIATEBYTREE, hWnd, NULL );