2006 年 6 月 25 日 22 時 22 分

システムへの登録


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


さて、作った ColumnProvider をシステムに登録する。
登録には 2 種類ある。COM ライブラリとしての登録と、
シェルのカラムハンドラへの登録だ。

まず COM ライブラリの登録だが、
.NET でプロジェクトのプロパティの設定をしておけば、
ビルド後に自動的に COM ライブラリ用の登録が行われる。

次にシェルのカラムハンドラへの登録だが、
これはレジストリに値を書き込むことで行われる。

HKEY_CLASSES_ROOT\Folder\shellex\ColumnHandlers の下に、
IColumnHandlers を実装したクラスの GUID のキーを作る。

COM では、インタフェースだけでなく、クラスにも、
固有で一意な GUID を割り当てることになっている。
これは、Class ID(CLSID)と呼ばれている。

.NET で COM ライブラリとして登録する際には、
クラスに CLSID が自動的に割り当てられるので便利だが、
これはビルドのたびにコロコロ変わるのでよろしくない。
そこで、決まった GUID を割り当てることにしよう。

GUID は、「ツール」⇒「GUID の作成」で作成できる。
なにやら英語の画面が出てくるので、
4 の Registry Format を選択し、
「Copy」を押せば、クリップボードにコピーされる。

ファイル名を指定して実行で「guidgen」でも起動できる。
起動できない人は、Visual Studio のインストール先の、
\Common7\Tools\guidgen.exe にあると思うので実行だ。

ここでは、以下のような GUID が生成された。
{47388840-7A1B-4cfc-BE15-4D9CAF1046A4}

これをクラスに CLSID として設定するためには、
クラスに GuidAttribute 属性を指定する。

    [Guid("47388840-7A1B-4cfc-BE15-4D9CAF1046A4")]
    public class ColumnProvider : IColumnProvider {

GuidAttribute 属性の場合、最初の引数に指定する GUID に、
中括弧を含んではいけないので削除する。
中括弧を含んでいた場合、ビルドエラーが発生するので注意。
(Guid 構造体のコンストラクタでは大丈夫なのだが)

さて、CLSID が決まったので、
シェルのカラムハンドラへの登録を行おう。
テストなので、以下のようなレジストリファイルを作る。

メモ帳を開き、以下のように 3 行記入し、
c:\reg.reg として保存しておく。
点線は含めないこと。また最後の長い行は 1 行で書く。

------------------------------------------------------
REGEDIT4

[HKEY_CLASSES_ROOT\Folder\shellex\ColumnHandlers\{47388840-7A1B-4cfc-BE15-4D9CAF1046A4}]
--------------------------------------------------------

同様に、以下も c:\unreg.reg として保存しておく。
上との違いは、HKEY_CLASSES_ROOT の前のマイナス記号だ。
これにより、レジストリのキーを削除することができる。
(意外と知られていないテクニックである)

------------------------------------------------------
REGEDIT4

[-HKEY_CLASSES_ROOT\Folder\shellex\ColumnHandlers\{47388840-7A1B-4cfc-BE15-4D9CAF1046A4}]
--------------------------------------------------------

これらのレジストリファイルを使えば、
暫定的なカラムの登録や登録解除ができる。

reg.reg をダブルクリックして登録し、
レジストリエディタでキーが登録されていることを確認し、
unreg.reg をダブルクリックして登録し、
上で作成したキーが削除されていることを確認しておく。

さて、テストをしてみようと言いたいところだが、
その前に、知っておくべき重要な注意点がある。

シェルの拡張には危険が伴う。
インタフェース記述が間違っていたり、
実装上に問題があった場合、
エクスプローラが起動できなくなる場合があるのだ。

エクスプローラは、ファイラーとしての機能だけでなく、
ユーザのデスクトップを表示するなどの重要な役割がある。
つまり、エクスプローラが起動しないということは、
手順を知らなければ何も操作ができなくなる。

もしエクスプローラが起動しない場合や、
起動してもなにやら挙動がおかしい場合、
以下の手順で復元をする必要がある。

Ctrl+Shift+Esc を押して、タスクマネージャを起動する。
「プロセス」タブを選択し、「explorer.exe」があれば
選択して「プロセスの終了」を押して殺す。
いくつも起動している場合は全て殺すこと。

実装に問題があり、エクスプローラが暴走している場合、
プロセスリストの表示やボタンの動作が
非常に遅くなる可能性もあるので、気長にやること。

「explorer.exe」を殺した後は、
「ファイル」⇒「新しいタスクの実行」を選び、
直接「cmd」と入力して「OK」を押す。
そうすると、コマンドプロンプトが起動する。
コマンドプロンプト(cmd.exe)は CUI の第 2 のシェルだ。

このとき、絶対に参照ボタンを「使わないこと」。
参照ボタンを押すと、エクスプローラのカラム関連の
ライブラリがロードされるため、同じトラブルが起きる。

コマンドプロンプトが起動すれば、
「c:\unreg.reg」 とタイプして実行すれば、
カラムハンドラの登録が解除されるので、
「explorer」とタイプしてエクスプローラを起動できる。

もし登録解除がうまくいかないなら、
「regedit」をタイプして、レジストリエディタを起動し、
手動で該当エントリを削除すること。

わざわざ c:\unreg.reg などに保存したのは、
迅速に復元できるように考えてのことだ。
復元がきっちりできる人なら、
レジストリファイルなどはどこに保存しても構わない。

では、テストを行おう。まず、プロジェクトのビルドを行い、
LoaferShellEx を COM ライブラリとして登録する。

そして、register.reg をダブルクリックして登録。
C:\ などをエクスプローラで表示し、詳細表示にする。

「表示」⇒「詳細表示の設定」を選ぶと、
一覧に、「テストカラム」があるので、
チェックをつけて、「OK」を押す。

すると、「テストカラム」の列が追加され、
ファイルの情報といして、「テスト値」が表示された。
これで、.NET でも拡張機能を作れることが証明された。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.