本記事は、COM Advent Calendar 2014 – Qiitaの11日目の記事です。まだ11日です。


ときには、アパートメントを越えてオブジェクトを受け渡すことがあります。その用途のAPIのうち、プロセス内でのやりとりに特化したものの一覧です。

いずれも、オブジェクトへの参照を表現する何らかの間接的なデータを受け渡す仕組みです。送り先のアパートメントでは、そのデータからマーシャルされたオブジェクト(プロキシ)への参照を得ることになります。1文目にアパートメント間で受け渡すデータの種類を記しました。

CoMarshalInterface
IStreamでやり取りします。オプション次第で、プロセス内にもプロセス間・コンピュータ間にも使えます。
CoMarshalInterThreadInterfaceInStream
IStreamでやり取りします。CoMarshalInterfaceをラップして簡素化したものです。
Global Interface Table (GIT)
DWORD値(クッキー)でやり取りします。MSDNライブラリ: Accessing Interfaces Across Apartments (COM)
RoGetAgileReference
IAgileReferenceでやり取りします。Windows 8.1で追加されました。MSDNライブラリ該当ページで書かれているように、GITより効率が良くなるよう改良されています。

なお、私は、ATL::CComGITPtrクラステンプレートとしてGITをよく使います。CoInitializeExなどをしていない外側でコピーコンストラクタ・コピー代入をしない(ムーブなら問題ない)ということさえ気を付ければ、簡単にアパートメントを越えて持ち運べます。

このほか、ATLにはCoMarshalInterfaceの系統をラップした関数もあります(MSDNライブラリ:マーシャリングに関するグローバル関数)。具体的には、AtlMarshalPtrInProc, AtlUnmarshalPtr, AtlFreeMarshalStreamです。ATL::CComGITPtrほど扱いやすくなっておらず、また私が知ったのはATL::CComGITPtrよりずっと後だったこともあり、使ったことがありません。

スポンサード リンク

この記事のカテゴリ

  • ⇒ マーシャリングのAPIまとめ(プロセス内限定)