2006 年 6 月 29 日 19 時 40 分

ショートカットの COM クラス


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


[写真]


カラムが 1 つだけなら寂しいので、
もう 1 つ、「リンク先」を表示するカラムを作ろう。
ショートカットファイルのリンク先を表示したい。

ショートカットもシェルの代表的な機能であり、
IColumnProvider と同じように COM ベースだ。

IColumnProvider と異なる点は、
ショートカット自体を扱うクラスが、
既にシェルに定義されている事である。

IColumnProvider では、シェルがクライアントだった。
IColumnProvider を実装したクラスは、
こちら側がライブラリ(COM サーバ)として提供した。

ショートカットを利用する場合、立場は逆となる。
こちらが、シェルが提供している COM クラスを作成し、
インタフェースを使って操作するクライアントとなる。

では、シェルが提供しているクラスの実体を探ってみよう。

レジストリエディタで HKEY_CLASSES_ROOT を開き、
「.lnk」のキー(フォルダみたいなやつ)を探す。
.lnk はショートカットファイルの拡張子だ。

「.lnk」を開くと、既定値として、「lnkfile」がある。
この「lnkfile」はプログラム ID(ProgID)と呼ばれる。

改めて HKEY_CLASSES_ROOT 直下から「lnkfile」を探す。
「lnkfile」を開くと、「CLSID」のキーがある。
「CLSID」の中を見ると、既定値に GUID 値っぽいのがある。

つまり「lnkfile」という ProgID を持つ COM クラスがあり、
そのクラスの CLSID は、
{00021401-0000-0000-C000-000000000046} だということだ。

また、拡張子「.lnk 」が「lnkfile」に関連づいているので、
このクラスを作成して使えば、
「.lnk 」ファイルを操作することができるという事だ。

次に、CLSID を元にクラスの情報を調べる。

HKEY_CLASSES_ROOT 直下から「CLSID」キーを開き、
さらに {00021401-0000-0000-C000-000000000046} を探す。
キーの中を見ると、既定値に Shortcut と書いてある。
シェルの COM クラスは、Shortcut という名称のようだ。

ここからは、oleview の力を借りよう。(面倒だから)
「ツール」⇒「OLE/COM オブジェクト ビューア」を実行。
インストールパスの Common7\Tools\Bin\oleview.exe だ。

左のツリーから、「Object Classes」を展開し、
「All Objects」を展開する。
そこから、上で見た「Shortcut」を探す。
(ツリーに直接 Shortcut とタイピングすれば速い)

見つかったら「Shortcut」を選択する。
右に CLSID が表示されるので CLSID が正しいか確認し、
左の Shortcut を展開する。(写真)
そうすると、インタフェースがずらっと並ぶ。
これらは「Shortcut」クラスが実装しているものだ。

IPersistFile は、ファイルを扱うクラスに代表的なもので、
ファイルへの保存やファイルからの読み込みなどを行う。
高級言語のシリアライズに近い意味合いのインタフェースだ。
(ショートカットもファイルの一種である)

一般的に、シェルのファイル駆動の COM クラスは、
IPersistFile をサポートしていることが多い。
COM オブジェクトはコンストラクタで初期化を行わないので、
IPersistFile の Load でファイルから読み込むことで、
インスタンスを初期化するという使い方をするのだ。

その他のインタフェースは、MSDN ライブラリを参照し、
インタフェースの説明や内容を見て目星を付ける。

どうも、IShellLinkW というのがあやしそうだ。
GetPath、GetWorkingDirectory などのメソッドがある。
どうやらあたりを引いたようだ。

では、明日はこれらを元に C# の定義を作る。



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