本記事は、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よりずっと後だったこともあり、使ったことがありません。
スポンサード リンク |
この記事のカテゴリ
- COM ⇒ マーシャリングのAPIまとめ(プロセス内限定)