COM 経由でオブジェクトのリストを送信できますか? 私にはクラスがあり、このクラスのリストもあります。そして、これを COM 関数で送信する必要があります。それをしてもいいですか?はいの場合、どのように?シリアル化マーシャリングは必要ですか?
3 に答える
COM は、特定のコレクション タイプを特定しません。リストをモデル化する標準はありません。慣例により、インターフェイスを使用して任意のコレクションをモデル化できます。たとえば、それぞれが IFoo を実装する Foo オブジェクトのコレクションがあるとします。次に、次のような IEnumFoo インターフェイスを宣言します。
interface IEnumFoo : IUnknown
{
HRESULT Next( [in] ULONG celt,
[out, size_is(celt), length_is(*pceltFetched)] IFoo **rgelt,
[in,out,unique] ULONG *pceltFetched );
HRESULT Skip( [in] ULONG celt);
HRESULT Reset();
HRESULT Clone( [out] IEnumFoo **ppenum );
}
次に、このインターフェイスの実装へのインターフェイス ポインターを返すだけで、クライアント コードがリストを列挙できるようになります。バリアントの非常に一般的な列挙型インターフェイス タイプである IEnumVARIANT については、 MSDN ドキュメントを確認してください。また、メソッドが何をするかについても説明します。
インターフェイスの片側が、VB6 やスクリプトなどの「より単純な」型システムの言語で記述される場合は、SAFEARRAY が適しています。COM のユニバーサル マーシャラーはそれを処理できます。
インターフェイスの両側に C++ があり、IDL でインターフェイスを定義し、カスタム マーシャリング コードを生成することに満足している場合、IDL には使用可能な「size_is」属性が含まれています。詳しくはこちらをご覧ください。
合理的な程度まで、std::list でこれを行う方法はありません。マニアックな方もいらっしゃると思いますが、私の経験上、割に合わないと思います。が std::list である必要がなく、リンクされたリストである必要がある場合は、新しい COM インターフェイスを定義してその実装を提供する (std::list のラッパーにすぎない) か、いくつかを見つける必要があります。目的に適した実装を持つサードパーティのリソース。COM インターフェイスを実装した経験があまりない場合は、かなりの量の資料を読む必要があります。
配列にできる場合は、SAFEARRAY を使用することで作業を大幅に簡素化できます。また、SAFEARRAY は、ほぼラッパーである ATL のCComSafeArrayを使用すると簡単に使用できます。COM オブジェクトを処理するときに、参照カウントなどの問題からあなたを助けたり、救おうとします。次に、COM オブジェクト間で配列を渡すだけです。メモリの割り当て解除の責任者に注意を払う必要があることを思い出してください。