シェルエクステンション、もしくはシェル拡張。ウィンドウズの内部に深く入り込む領域。故に、近寄り難く、そして魅かれる。この講座では、この「シェルエクステンション」というものがどれほどのものかというものを見てみましょう。実は簡単?
|
シェルってなぁに?
シェル、英語で「貝殻」の意味です。コンピューターの分野では、「OSを包み込んで、ユーザーとの間を取り持つ物」のことを意味します。ちょうど、DOSとウィンドウズ3.1のような関係だと考えると解りやすいかもしれません。 「ウィンドウズ95はOSなのかシェルなのか」という話はここでは置いておきます。ここでは、ウィンドウズをさらに包み込む「シェル」について見てみたいと思います。
ウィンドウズが持つシェルは、「ネームスペース」と呼ばれています。このネームスペースは主にファイル関連の拡張を行うもので、この機能によって無機的なファイルやフォルダを解りやすいオブジェクトに見せかけることができます。 |
エクスプローラーという存在
ウィンドウズ付属の、いわゆる「フォルダ」、正式名称「エクスプローラー」は、ネームスペースが持つもっとも強力な色眼鏡です。 エクスプローラーはネームスペースが持つ機能をフルに活用したファイラーです。通常、ファイラーなら「ファイル名」や「サイズ」くらいしか分からないのに、エクスプローラーはアイコンを取得し、プロパティを表示し、リンク先を開き、さらにエクスプローラー自身を変更するという荒技を成し遂げます。
エクスプローラーは「ネームスペースとシェルエクステンションは、内部的なもので難しいもの」という風に思わせることにみごとに成功しています。ですが、それこそ「色眼鏡」です。 |
ゴミ箱を作ろう!!
ゴミ箱がいっぱいあったら便利でしょう。とりあえずそういうことにしてください(汗)。というわけでゴミ箱を作ってみましょう!!(方法はこのページを参考にしました) まず、ファイラーでゴミ箱のフォルダを見てみてください。フォルダ名はRecycledだと思います。ドライブはどれでもOK。このフォルダの中に、おそらくdesktop.iniというファイルがあると思います(IE4をインストールしてる方には、このファイル名はなじみ深いかもしれないですね)。 このゴミ箱フォルダをエクスプローラーで見ても、こんなファイル存在しません。だいたい、存在したら「ゴミ箱を空に」を選んだら削除されるはずです(笑)。この辺が「エクスプローラーの色眼鏡」なのです。
ちょっと話が逸れましたね。さて、「ニューゴミ箱フォルダ」にするフォルダを、新しく作ってください。まぁ新しくなくてもいいんですが、中にファイルがあるとうまくいかないので、まっさらなフォルダがいいんです。
と言っても、これはちょっと不完全なゴミ箱だったりします。どうやら再起動すると、ホントのちゃんとしたゴミ箱に完成するみたいです。 |
シェル「エクステンション」
本題に入りましょう。このゴミ箱フォルダだって、基本的にはただのディレクトリです。この「ただのディレクトリ」を「ゴミ箱」に変えてしまう。これが「シェルエクステンション」、つまり拡張部分ということです。 シェルエクステンションの機能は、ファイルやフォルダに拡張機能を与えるものです。拡張機能は、「特殊な機能をフォルダに持たせる」「エクスプローラーのシステムを変える機能をフォルダに持たせる」「ドロップしたときにファイル名を渡す以外の機能をファイルに持たせる」「様々なプロパティをファイルに持たせる」等々、まさに「ユーティリティの極み」とでも言えるものが目白押しです。
これらの機能は、何度も言うようにそれほど難しいものではありません。desktop.iniを置き、このファイルを「隠しファイル」にし、フォルダを「読み取り専用」にする、たったこれだけです。 |
レジストリ紀行
まず、先ほどのdesktop.iniを開いてください。これは単なるテキストファイルなので、メモ帳でもエディタでもワープロソフトでもなんでも開くことができます。 中には、次のように書かれていることでしょう。
[.ShellClassInfo]
1行目は「次の行にシェルエクステンションのことが書いてあるよ」ってことを示しているものです。だから飛ばして、2行目。
レジストリエディタを開いてください(お約束ですが、レジストリは各種の重要なデータを格納しているので、不用意な操作を行う前に必ずバックアップを取っておいてください。この操作によって引き起こされてしまった問題に対して、当方は一切関知しないからそのつもりで)。まず「HKEY_CLASSES_ROOT」を開いて、その中から「CLSID」を開いてください。おお、早速核心に触れた感じですね。
さて、この中の「InProcServer32」を見てみてください。「標準」キーにはDLLの名前があると思います。このDLLに、拡張機能を実現するプログラムが入っているのです。 |
COMインターフェイス
このDLLの中に入っている物は、「インターフェイス」と呼ばれる物です。エクスプローラーなどは、このインターフェイスを見つけると、その機能を持たせた空のインターフェイス(これをインスタンスと呼びます)を作製し、フォルダやファイルを登録します。 次にこのインターフェイスから、前述した「特殊な機能をフォルダに持たせる」「エクスプローラーのシステムを変える機能をフォルダに持たせる」といった機能を実現するインターフェイスをさらに取得します。そして、このインターフェイスを色々することで、様々な「シェルエクステンション」を実現するというわけです。
インターフェイスは、プログラミング的にはC++のクラスに非常に似ています。違う部分は、パブリックなメンバ変数を持たないこと、メンバ関数を「メソッド」と呼ぶこと、継承の方法が違うことです。「継承」は、上のような次々と他のインターフェイスを作っていくことで実現します。
こう書くと、インターフェイスは難しそうに感じるかもしれません。でもそんなことはありません。 |
他のフォルダやファイルについて
以上で、「ゴミ箱」についての流れについて見てみました。 同じことが、他の特殊フォルダにも当てはまります。ちなみに「どれが特殊フォルダか」ということは、まぁdesktop.iniを探してみればいいでしょう(プログラミング的には、FindFirstFile()等を使えば、シェルエクステンションに邪魔されずに見つけだせます。「けしかぶ」を使ってみましょう(笑))。 ある程度は、見た目で分かります。フォルダのアイコンがちょっと違えばそうです。でも、一見普通のフォルダっぽいものも、実は特殊フォルダだったりします。ちゃんと調べないと分からないですね。
その他のフォルダですが、まず「マイコンピューター」「コントロールパネル」「プリンタ」については、「すべてのウィンドウズに必要」とみなされて、デフォルトで存在するようなシステム(つまりウィンドウズの内部的な部分)になっているようです。
フォルダではなくファイルの場合は、まずHKEY_CLASSES_ROOTから「そのファイルの拡張子」のセクションを見、「標準」キーのアプリケーション名を、同じくHKEY_CLASSES_ROOTから検索し、その中のCLSIDのセクションにクラスIDが書かれているので、あとはフォルダと同じ手順を取ればOKです。
レジストリの中を行ったり来たりしてますが、あまり深く考えず「こういうシステムになってるんだ」というような感じで憶えた方がいいかもしれません。 |
まとめ
この講座では、当分の間この「インターフェイス」をどのようにして使えばいいのかを説明していきます。つまり、「使う側」の話ということです。「使われる側」の話、つまり「拡張させる」部分は、そのあと、できれば、見ていきたいと思います。 |
(C)KAB-studio 1998 ALL RIGHTS RESERVED. |