このアーカイブは同期化されません。 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 でも拡張機能を作れることが証明された。