EternalWindows
シェル拡張 / 仮想フォルダの概要

シェル拡張の中で最も実装が難しく、また最もユーザーにとって身近な存在であるのは仮想フォルダではないかと思われます。 仮想フォルダとは、あたかもファイルシステム上に存在するかのように表示された見せかけのフォルダであり、 マイコンピュータやコントロールパネル、ごみ箱などはその代表例といえるでしょう。 仮想フォルダは通常のフォルダと同じように開くことができるわけですが、 そこに表示されるアイコンはファイルシステム上のファイルやフォルダを表したものではなく、 仮想フォルダによって動的に提供されたアイテムに過ぎません。 このアイテムが選択されたときに何を行うかは全くの自由であるため、 マイコンコンピュータのようにDVDドライブをオープンすることも可能になります。

仮想フォルダを作成するというのは、シェル拡張が持っている機能をフォルダというUIを通じて提供することです。 たとえば、コントロールパネルを表示すると「システムとメンテナンス」というアイテムが見つかりますが、 これはそうしたフォルダが実在することを意味しているのではなく、 単にそうした機能をユーザーに提供しているだけです。 仮想フォルダを作成する方法は主に2通りあり、 1つは次のようなデフォルトのフォルダビューを使用する方法が挙げられます。

このフォルダビューは、通常のフォルダと同じようにリストビューで表示されていますが、 決して中に列挙されているのはファイルやフォルダではありません。 これは仮想フォルダによって提供されたアイテムであり、仮想フォルダが持っている機能を表しています。 左のツリービューから分かるように、この仮想フォルダにはデスクトップからアクセスすることができます。

2つ目の方法は、デフォルトではなく独自のフォルダビューを作成する方法です。 この方法はアイテムの表示をデフォルトのフォルダビューに任せるのではなく、 フォルダビューのウインドウ自体をシェル拡張が作成することになるため、 どのような描画でも行うことができます。

このフォルダビューに表示されているのは、シェル拡張が作成したウインドウのクライアント領域です。 このクライアント領域には、仮想フォルダが持っている2つのアイテムが表示されなければならないため、 アイテムに関連するアイコンを2つ描画し、さらにアイテムを選択できるようにSysLinkコントロールを配置しています。 こうした作業から分かるように、仮想フォルダのUIを考えることは通常のアプリケーションのUIを考えることとそれほど変わりありません。 しかし、アプリケーションという形ではなくフォルダという形で機能を提供することにより、 他のフォルダから仮想フォルダ(独自のUI)への切り替えがいつでも行える利点などが生じます。

仮想フォルダは、シェル名前空間と密接な関係があります。 シェル名前空間といえば、アイテムをPIDL(アイテムIDリスト)で表し、 フォルダをIShellFolderインターフェースで表すというものですが、仮想フォルダもこの例に該当します。 仮想フォルダを実装するというのはIShellFolderなどを継承したクラスを定義するということであり、 各種メソッドはフォルダとしての機能を満たすものになっていなければなりません。 たとえば、IShellFolder::EnumObjectsが呼び出された場合は、 自身が提供するアイテムを列挙するためのIEnumIDListを返すことになります。 シェル名前空間のプログラミングでIShellFolderを使用したことがある場合は、 IShellFolderの実装は分かりやすいものになると思われます。

仮想フォルダの実装が複雑といっても、それはシェル拡張の1つに過ぎない点に注意してください。 つまり、他のシェル拡張と同じようにレジストリ登録が必要になりますし、 シェルの起動時にDLLがロードされるという点も同一です。 また、不要になったシェル拡張を削除するためには、 DLLの登録を解除してからシェルを再起動しなければならない点も共通しています。 次節からは、仮想フォルダを実装する上で必要となるクラスを順に見ていき、 最終的に4つのサンプルを提示します。


戻る