<!DOCUMENT HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

<html lang="ja">

<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" type="text/css" href="../../default.css">
<title>Yet Another CComObject</title>
</head>

<body>
<!--#include virtual="../../menu2.html"-->
<div class="contents">

<h4>contents</h4>
<ol>
	<li><a href="#motivation">動機</a></li>
	<li><a href="#usage">使い方</a></li>
	<li><a href="#conclusion">結論</a></li>
</ol>
</div>

<h1>Yet Another CComObject</h1>

<!--- Summary --->
<div>
<p>ATL/WTL とは直接関係はありませんが、テンプレートを使った IUnknown 実装用クラスです。</p>
</div>

<h2 id="motivation">動機</h2>
<div>
<p>ATLで一番最初につまづいたのが、マクロの山でした。
VS.NET になって、さらに属性が追加され、ますます理解不能になってしまいました。
仕方が無いので、自分で簡易版のCComObjectを作ってしまおうというのが動機です。
テンプレートを利用することで、マクロに頼らなくてもかなり自動化することができます。</p>
</div>

<h2 id="usage">使い方</h2>
<div>
<p>サンプルを以下に示します。（<a href="ComObject.zip">プロジェクト</a>）</p>

<pre><code>// <a href="ComObjectTest.cpp">ComObjectTest.cpp</a><br>
#include &quot;<a href="ComObject.h">ComObject.h</a>&quot;

class MyStream : public ComObject&lt; MyStream, TYPELIST_2(IStream, ISequentialStream) &gt;
{ ... };</code></pre>

<p>ComObject の第１テンプレート引数には、それを実装するクラスの名前を渡します。
第２テンプレート引数には、実装したいQueryInterfaceで対応したいIUnknown以外のインタフェースを並べたタイプリストを渡します。
これだけで、<code>IUnknown::QueryInterface()</code> が自動的に実装されます。</p>
<p>上記の例のように、<b>IStream is derived from ISequentialStream</b> のような関係がある場合、C++的な継承はIStreamのみで十分です。
与えられたタイプリストを単純にすべて継承してしまうと、ISequentialStream の分だけ無駄ということになります。
そこで、Loki のタイプ操作テンプレートなどを利用して、必要十分なインタフェースのみを継承するようにしました。
詳細は、<a href="ComObject.h">ソースコード</a> をご覧ください。</p>
</div>

<h2 id="conclusion">結論</h2>
<div>
<p>ティアオフインタフェースなどの特殊なことはできませんが、最小限の記述で無駄無くIUnknownを実装できます。
独自のストリームの実装、シェルエクステンション、IEコンポーネントの利用などで IUnknown を実装する場合には十分使えると思います。
</p>
</div>

<hr>
<!--#config timefmt="%Y/%m/%d"-->
<p align="right"><!--#echo var='LAST_MODIFIED'--></p>

</body>
</html>
