シェルエクステンションって?

 シェルエクステンション、もしくはシェル拡張。ウィンドウズの内部に深く入り込む領域。故に、近寄り難く、そして魅かれる。この講座では、この「シェルエクステンション」というものがどれほどのものかというものを見てみましょう。実は簡単?

シェルってなぁに?
 シェル、英語で「貝殻」の意味です。コンピューターの分野では、「OSを包み込んで、ユーザーとの間を取り持つ物」のことを意味します。ちょうど、DOSとウィンドウズ3.1のような関係だと考えると解りやすいかもしれません。
 「ウィンドウズ95はOSなのかシェルなのか」という話はここでは置いておきます。ここでは、ウィンドウズをさらに包み込む「シェル」について見てみたいと思います。

 ウィンドウズが持つシェルは、「ネームスペース」と呼ばれています。このネームスペースは主にファイル関連の拡張を行うもので、この機能によって無機的なファイルやフォルダを解りやすいオブジェクトに見せかけることができます。
 ここで重要なのは「見せかけている」ということです。シェルはあくまで仲介役であって、メインではありません。ファイルやフォルダはウィンドウズの持ち物です。シェルは、それを見せかける「色眼鏡」でしかないということです。
 ベースにあるファイルシステムは、DOSの物とまったく変わりません。ルートにはドライブが並び、そこからツリー上にフォルダが存在し、各ファイルが格納されているわけです。
 ネームスペースは、これらがまるでマイコンピューターの中に存在するかのように見せかけ、さらにデスクトップの中に存在するかのように見せかけ、コントロールパネルやプリンタといったファイルが存在するように見せかけているのです。

エクスプローラーという存在
 ウィンドウズ付属の、いわゆる「フォルダ」、正式名称「エクスプローラー」は、ネームスペースが持つもっとも強力な色眼鏡です。
 エクスプローラーはネームスペースが持つ機能をフルに活用したファイラーです。通常、ファイラーなら「ファイル名」や「サイズ」くらいしか分からないのに、エクスプローラーはアイコンを取得し、プロパティを表示し、リンク先を開き、さらにエクスプローラー自身を変更するという荒技を成し遂げます。

 エクスプローラーは「ネームスペースとシェルエクステンションは、内部的なもので難しいもの」という風に思わせることにみごとに成功しています。ですが、それこそ「色眼鏡」です。
 試しに「FileVisor」のようなファイラーを使って、フォルダを見てみましょう(あいにく「まどかぶ」ではダメです。まどかぶは「エクスプローラー」タイプのファイラーなのです(笑))。デスクトップやコントロールパネルのようなフォルダはないでしょう。これは、このアプリケーションが純粋なファイラーだからです。
 では、この「ファイラー」を使って、ネームスペースの化けの皮を剥いでみましょう。

ゴミ箱を作ろう!!
 ゴミ箱がいっぱいあったら便利でしょう。とりあえずそういうことにしてください(汗)。というわけでゴミ箱を作ってみましょう!!(方法はこのページを参考にしました)
 まず、ファイラーでゴミ箱のフォルダを見てみてください。フォルダ名はRecycledだと思います。ドライブはどれでもOK。このフォルダの中に、おそらくdesktop.iniというファイルがあると思います(IE4をインストールしてる方には、このファイル名はなじみ深いかもしれないですね)。
 このゴミ箱フォルダをエクスプローラーで見ても、こんなファイル存在しません。だいたい、存在したら「ゴミ箱を空に」を選んだら削除されるはずです(笑)。この辺が「エクスプローラーの色眼鏡」なのです。

 ちょっと話が逸れましたね。さて、「ニューゴミ箱フォルダ」にするフォルダを、新しく作ってください。まぁ新しくなくてもいいんですが、中にファイルがあるとうまくいかないので、まっさらなフォルダがいいんです。
 次に、このフォルダへ、先ほどのdesktop.iniコピーしてください。これは大丈夫でしょう。
 コピーしたら、このファイルのプロパティを開いて、属性を「隠しファイル」にしてください。ま、コピーしたのならたぶんなっています。
 最後に、この「ニューゴミ箱フォルダ」のプロパティを表示し、「読み取り専用」にしてください。
 はいっ、これで完成!! フォルダの「表示」−「最新の情報に更新」を選べば、ほーら、フォルダがゴミ箱の物になっているでしょう。これで、ゴミ箱の完成です

 と言っても、これはちょっと不完全なゴミ箱だったりします。どうやら再起動すると、ホントのちゃんとしたゴミ箱に完成するみたいです。

シェル「エクステンション」
 本題に入りましょう。このゴミ箱フォルダだって、基本的にはただのディレクトリです。この「ただのディレクトリ」を「ゴミ箱」に変えてしまう。これが「シェルエクステンション」、つまり拡張部分ということです。
 シェルエクステンションの機能は、ファイルやフォルダに拡張機能を与えるものです。拡張機能は、「特殊な機能をフォルダに持たせる」「エクスプローラーのシステムを変える機能をフォルダに持たせる」「ドロップしたときにファイル名を渡す以外の機能をファイルに持たせる」「様々なプロパティをファイルに持たせる」等々、まさに「ユーティリティの極み」とでも言えるものが目白押しです。

 これらの機能は、何度も言うようにそれほど難しいものではありません。desktop.iniを置き、このファイルを「隠しファイル」にし、フォルダを「読み取り専用」にする、たったこれだけです。
 この機能を使う場合、例えばフォルダの場合には、「desktop.ini」−「CLSID」−「レジストリ」−「COMインターフェイス」という流れをたどることで、上の機能を使用することができますし、この流れをちょいと曲げることで、「拡張」することができるというわけです。では、この流れを追ってみましょう。

レジストリ紀行
 まず、先ほどのdesktop.iniを開いてください。これは単なるテキストファイルなので、メモ帳でもエディタでもワープロソフトでもなんでも開くことができます。
 中には、次のように書かれていることでしょう。

[.ShellClassInfo]
CLSID={645FF040-5081-101B-9F08-00AA002F954E}

 1行目は「次の行にシェルエクステンションのことが書いてあるよ」ってことを示しているものです。だから飛ばして、2行目。
 このCLSIDとは、クラスIDという意味です。クラス!? と聞くと、どうしてもC++のものを思い浮かべてしまうでしょう。もしかしたら、ウィンドウクラスのことを思い浮かべる方もいるかもしれません。が、そのどちらとも違います
 他のゴミ箱を見てみれば分かりますが、同じ「ゴミ箱」であれば、すべて同じクラスIDを持っています。また、ブリーフケースやフォントフォルダは、別のクラスIDを持っています。このクラスIDの正体を突き詰めるためにも、さらに先を見てみましょう。

 レジストリエディタを開いてください(お約束ですが、レジストリは各種の重要なデータを格納しているので、不用意な操作を行う前に必ずバックアップを取っておいてください。この操作によって引き起こされてしまった問題に対して、当方は一切関知しないからそのつもりで)。まず「HKEY_CLASSES_ROOT」を開いて、その中から「CLSID」を開いてください。おお、早速核心に触れた感じですね。
 中には先ほど出てきた「中カッコに囲まれた長ったらしい16進データ」がずらーっと並んでいます。この中から、先ほどの「ゴミ箱」のものを探してください。「検索」を行えばすぐ見つかるでしょう。
 これをクリックすれば一目瞭然、「標準」キーに「ゴミ箱」の名が!!

 さて、この中の「InProcServer32」を見てみてください。「標準」キーにはDLLの名前があると思います。このDLLに、拡張機能を実現するプログラムが入っているのです。
 で、どんなプログラムが入っているんでしょうか。

COMインターフェイス
 このDLLの中に入っている物は、「インターフェイス」と呼ばれる物です。エクスプローラーなどは、このインターフェイスを見つけると、その機能を持たせた空のインターフェイス(これをインスタンスと呼びます)を作製し、フォルダやファイルを登録します。
 次にこのインターフェイスから、前述した「特殊な機能をフォルダに持たせる」「エクスプローラーのシステムを変える機能をフォルダに持たせる」といった機能を実現するインターフェイスをさらに取得します。そして、このインターフェイスを色々することで、様々な「シェルエクステンション」を実現するというわけです。

 インターフェイスは、プログラミング的にはC++のクラスに非常に似ています。違う部分は、パブリックなメンバ変数を持たないことメンバ関数を「メソッド」と呼ぶこと継承の方法が違うことです。「継承」は、上のような次々と他のインターフェイスを作っていくことで実現します。
 また、システム的な部分としてAPIまたは他のインターフェイスのメソッドから取得したポインタを通してのみ、インターフェイスを使うことが許されます。つまり、実変数のような形としては使えないということです。これはハンドルに似た形と言えるでしょう。さらに、クラスのようにコンストラクタやデストラクタを持たないので、このポインタはプログラム上で破棄しなければならないというめんどくささも持っています。

 こう書くと、インターフェイスは難しそうに感じるかもしれません。でもそんなことはありません。
 最初に戻ってみましょう。元々は、無機的なファイルやフォルダでした。これを「分かりやすい」ものにするため、ネームスペースとシェルエクステンションが存在するわけです。
 本来なら、その「奥深いもの」を操作する必要があるところが、シェルエクステンションにはちゃんと「プログラミングのためのシステム」が用意されているのです。しかも、それはオブジェクト指向な、とても概念的に分かりやすいものです。
 最初は、他のプログラミングとの違いに戸惑うかもしれません。でも、その「しきたり」をちょっと憶えてしまえば、それが「単に見えていなかったから」ということに気付くでしょう。

他のフォルダやファイルについて
 以上で、「ゴミ箱」についての流れについて見てみました。
 同じことが、他の特殊フォルダにも当てはまります。ちなみに「どれが特殊フォルダか」ということは、まぁdesktop.iniを探してみればいいでしょう(プログラミング的には、FindFirstFile()等を使えば、シェルエクステンションに邪魔されずに見つけだせます。「けしかぶ」を使ってみましょう(笑))。
 ある程度は、見た目で分かります。フォルダのアイコンがちょっと違えばそうです。でも、一見普通のフォルダっぽいものも、実は特殊フォルダだったりします。ちゃんと調べないと分からないですね。

 その他のフォルダですが、まず「マイコンピューター」「コントロールパネル」「プリンタ」については、「すべてのウィンドウズに必要」とみなされて、デフォルトで存在するようなシステム(つまりウィンドウズの内部的な部分)になっているようです。
 「マイコンピューター」内の他のフォルダ(「ダイヤルアップネットワーク」とか)はHKEY_LOCAL_MACHINE-SOFTWARE-Microsoft-Windows
-CurrentVersion-explorer-mycomputer-NameSpace
にクラスIDが書かれています。
 「デスクトップ」内の「インターネット」や「ゴミ箱」、「タスクトレイ」はHKEY_LOCAL_MACHINE-SOFTWARE-Microsoft-Windows
-CurrentVersion-explorer-Desktop-NameSpace
にクラスIDが書かれています。これ以外のファイルはHKEY_CURRENT_USER-SOFTWARE-Microsoft-Windows
-CurrentVersion-explorer-Shell Folders
に書かれた「デスクトップフォルダ(たいがいはwindows\デスクトップ)」に置いてあります。

 フォルダではなくファイルの場合は、まずHKEY_CLASSES_ROOTから「そのファイルの拡張子」のセクションを見、「標準」キーのアプリケーション名を、同じくHKEY_CLASSES_ROOTから検索し、その中のCLSIDのセクションにクラスIDが書かれているので、あとはフォルダと同じ手順を取ればOKです。

 レジストリの中を行ったり来たりしてますが、あまり深く考えず「こういうシステムになってるんだ」というような感じで憶えた方がいいかもしれません。

まとめ
 この講座では、当分の間この「インターフェイス」をどのようにして使えばいいのかを説明していきます。つまり、「使う側」の話ということです。「使われる側」の話、つまり「拡張させる」部分は、そのあと、できれば、見ていきたいと思います。

(C)KAB-studio 1998 ALL RIGHTS RESERVED.