ハードリンク

COM サーバをレジストリに登録し、
実際にアイコンが表示されるかどうか試してみよう。

レジストリへの登録内容は昨日書いたとおりだが、
登録は COM クラス単位で行うので、
複数の COM クラスを提供するサーバの場合、
その数だけ登録する必要がある。

本来はプログラムから登録を行うのだが、
この時点ではまだ動作確認だけでよいので、
レジストリへの登録や登録解除は、
レジストリファイルを使うことにしよう。

COM サーバ LinkIconOverlays.dll が提供するのは、
HardLinkIconID クラス 1 つだけなので、
以下のような情報を登録する必要がある。

========== register.reg ==========

REGEDIT4

[HKEY_CLASSES_ROOT\CLSID\{755525B6-51FB-490b-A21B-91F7208C9429}]
@="Loafer Hard Link Icon Overlay Identifier"

[HKEY_CLASSES_ROOT\CLSID\{755525B6-51FB-490b-A21B-91F7208C9429}\InProcServer32]
@="C:\\mixi\\LinkIconOverlays\\Debug\\LinkIconOverlays.dll"
"ThreadingModel"="Apartment"

========== (register.reg) ==========

InProcServer32 キーの既定値には DLL のパスを登録する。
これは DLL が配置される場所によって異なることになる。

また、昨日述べた COM サーバのスレッディングモデルも
レジストリに登録する必要がある。

InProcServer32 キーは文字列値 ThreadingModel を持ち、
ここに、スレッディングモデルの値が入る。
STA Model の場合は「Apartment」とする必要がある。

さて、LinkIconOverlays.dll は COM サーバだけでなく、
シェルエクステンションでもあるため、
シェルに対しても別途登録をしなければならない。

これは、シェルエクステンションの種類によっても異なり、
アイコンの重ね合わせハンドラの場合は、
以下のキーを作成し、そのデフォルト値として、
クラス ID の文字列表現を登録する必要がある。

HKEY_LOCAL_MACHINE
+ Software
    + Microsoft
       + Windows
          + CurrentVersion
             + Explorer
                + ShellIconOverlayIdentifiers
                   + クラスの説明
                      - (既定値) = クラス ID

========== (register.reg) ==========

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\Loafer Hard Link Icon Overlay Identifier]
@="{755525B6-51FB-490b-A21B-91F7208C9429}"

========== end of register.reg ==========

不思議なのは、「クラスの説明」をキーとして使うことだ。
ShellIconOverlayIdentifiers キーの下には、
重ね合わせアイコンを提供する COM クラスのキーが並ぶが、
その際に説明文が偶然重なる可能性は否定できない。
そのため、ある程度長い説明文を登録することが推奨される。

この register.reg をレジストリに追加すれば、
シェルエクステンションとして利用できる事になる。

では、登録用に対応して、登録解除用のファイルも作ろう。

シェルエクステンションは、シェルの一部として動作する。
テスト中に万が一 explorer.exe が起動しなくなっても、
すぐに登録解除できるように準備をしておこう。

========== unregister.reg ==========

REGEDIT4

[-HKEY_CLASSES_ROOT\CLSID\{755525B6-51FB-490b-A21B-91F7208C9429}]

[-HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\Loafer Hard Link Icon Overlay Identifier]

========== end of unregister.reg ==========

CLSID 配下のクラス ID のキーと、
そして、ShellIconOverlayIdentifiers 配下の
説明文の入ったキーを丸ごと削除するファイルとなる。

では、試してみよう。

まず、ハードリンクを作らなければ確認できない。
Windows XP には、fsutil というコマンドがあり、
これを使ってハードリンクを作成することができる。

    > fsutil hardlink create perl5.exe perl.exe

これで、perl.exe と同じ内容の perl5.exe が作成される。
ハードリンクはデータのコピーは行わないので、
巨大なファイルに対して行っても一瞬でできるはずだ。

次いで、Power Users 以上の権限でログオンし、
register.reg をレジストリに追加する。
その状態でエクスプローラを開き、
ハードリンクを作ったフォルダに移動してみる。

さて、どうだろうか。成功した場合は、
アイコンの左下に小さい青印があるはずだ。
俺の環境では写真のようになった。
ひとまずは成功ということになる。

もし何かがおかしい場合は表示されないし、
コードに致命的な問題があった場合は、
フォルダを開くタイミングで落ちることもある。

その場合は、Ctrl+Shift+Esc か Ctrl+Alt+Del 等から
タスクマネージャを起動し、新しいタスクの実行で、
cmd や regedit を起動することができるので、
unregister.reg を使って登録解除すれば元に戻せる。