contents

  1. 動機
  2. 使い方
  3. 結論

Yet Another CComObject

ATL/WTL とは直接関係はありませんが、テンプレートを使った IUnknown 実装用クラスです。

動機

ATLで一番最初につまづいたのが、マクロの山でした。 VS.NET になって、さらに属性が追加され、ますます理解不能になってしまいました。 仕方が無いので、自分で簡易版のCComObjectを作ってしまおうというのが動機です。 テンプレートを利用することで、マクロに頼らなくてもかなり自動化することができます。

使い方

サンプルを以下に示します。(プロジェクト

// ComObjectTest.cpp
#include "ComObject.h" class MyStream : public ComObject< MyStream, TYPELIST_2(IStream, ISequentialStream) > { ... };

ComObject の第1テンプレート引数には、それを実装するクラスの名前を渡します。 第2テンプレート引数には、実装したいQueryInterfaceで対応したいIUnknown以外のインタフェースを並べたタイプリストを渡します。 これだけで、IUnknown::QueryInterface() が自動的に実装されます。

上記の例のように、IStream is derived from ISequentialStream のような関係がある場合、C++的な継承はIStreamのみで十分です。 与えられたタイプリストを単純にすべて継承してしまうと、ISequentialStream の分だけ無駄ということになります。 そこで、Loki のタイプ操作テンプレートなどを利用して、必要十分なインタフェースのみを継承するようにしました。 詳細は、ソースコード をご覧ください。

結論

ティアオフインタフェースなどの特殊なことはできませんが、最小限の記述で無駄無くIUnknownを実装できます。 独自のストリームの実装、シェルエクステンション、IEコンポーネントの利用などで IUnknown を実装する場合には十分使えると思います。