Entering Passive Mode

カテゴリ 'COM' の記事
< 1 2 3 4 5 6 7 >

アイコンの作成

アイコン

次に行う作業は、表示させるアイコンの作成である。
今回は、以下の 3 種類のアイコンを表示させる予定である。

・ハードリンク
・マウントポイント(ボリューム・ジャンクション)
・フォルダリンク(シェルのフォルダショートカット)

残念ながら、デザインをする腕は持ち合わせてないので、
シェルが元々持っているショートカットアイコンに、
色をつけて適当に捏造することにする。

基本ヘッダとソースファイルの作成

早速アイコンを提供するクラスを実装…と行きたい所だが、
先にプロジェクトに下準備をしておく必要がある。

ちょっと前に、DLL のプロジェクトを作っときながら、
いままで放ったらかしにしてたので、
今日はヘッダやソースをプロジェクトに追加していこう。

今後やたらと COM クラスが出てくるのであるが、
クラスを追加する都度、少し前に作った、
IUnknown の実装である Object のコードをコピーして、
クラスを量産していくことはできる。

IShellIconOverlayIdentifier インタフェース

そろそろ本題も進めていきたいので、
実際に使うインタフェースを取り上げてみよう。

シェルに独自の重ね合わせアイコンを提供するサーバは、
IShellIconOverlayIdentifier を実装したクラスを作成し、
アイコンに関する情報をシェルに通知する必要がある。

IShellIconOverlayIdentifier の定義を以下に示す。

class IShellIconOverlayIdentifier : public IUnknown {

サーバから見た IUnknown(後編)

保留にしていた QueryInterface の実装を考えて見よう。
IUnknown の最大の山場が QueryInterface である。

クライアント側がインタフェースを利用する際に呼び出され、
インスタンスがインタフェースを実装しているか確認し、
実装していれば新しいインタフェースポインタを返す。

==================================================
HRESULT Object::QueryInterface(
        /* [in] */ REFIID riid,
        /* [out] */ void** ppvObject) {

サーバから見た IUnknown(前編)

サーバ側はクラスの実装を提供する必要がある。
C++ クラスに IUnknown インタフェースを実装すると、
COM によって操作可能なクラスとなる。

では、最も基本的な COM クラスの枠組みを考えてみよう。
まずは、クラスの定義である。
通常、これはヘッダファイルに記述する。

==================================================
class Object : public IUnknown {

クライアントから見た IUnknown

IUnknown の定義を再度引用しておこう。

class IUnknown {

public:

    virtual HRESULT STDMETHODCALLTYPE QueryInterface(
            /* [in] */ REFIID riid,
            /* [out] */ void** ppvObject) = 0;

    virtual ULONG STDMETHODCALLTYPE AddRef() = 0;

クラスとインタフェース

COM はクライアントサーバシステムであるため、
クラスの設計について、特殊なルールを定めている。

それは、実装側と利用側を明確に区別し、
利用側には、クラスの継承階層を持ち込まず、
インタフェースのみによる制約を課していることである。

一般的なオブジェクト指向の設計では、
クラスとインタフェースを駆使して開発を行うが、
その結果完成したクラスの継承階層には、
「クラスを単に利用する」ための情報と、
「クラスを拡張する」ための情報が混在している。
前者は利用側のための、後者は実装側のための情報である。

インプロセスサーバ = DLL + DllGetClassObject

COM サーバの開発には、Visual Studio を使う事が多い。

Visual Studio で COM と言うと、
MFC や ATL などの高度なライブラリを使い、
ウィザードを併用して開発するイメージがある。

確かにこれら高度なライブラリを使えば、
素早く開発を行うことができるんだが、
COM の基幹部分がライブラリに隠蔽されているため、
どういう風に動作しているかがいまいち見えにくい。

シェルエクステンションと COM サーバ

シェルエクステンションは、以前に取り上げたが、
そのときは、C# を使って高水準のプログラミングを行った。
今回は C++ を使い、COM の低水準の実装を考えることにしよう。

以前は、COM の解説をすっ飛ばして実装に行ったが、
今回はゆっくりと進めることにする。

シェルエクステンションは、主に DLL として実装され、
COM の規約に基づいてオブジェクトを提供する。
エクスプローラは、それを利用する側となる。

エクスプローラの重ね合わせアイコン

エクスプローラではファイルやフォルダを
アイコンで視覚的に表示することができる。

エクスプローラのアイコン表示は、
基本となるアイコンと、それに対するエフェクト、
そして、別のアイコンを重ね合わせることで行われている。
エフェクトと重ね合わせは任意選択である。

基本となるアイコンは、ファイルの関連付けで分類される。
通常は、拡張子別にレジストリに登録されているが、
これは自由に変更することができるようになっている。

< 1 2 3 4 5 6 7 >
このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS