COM、BSTR を含むバリアント。誰が割り当てますか?
質問
そうですね、これを要約する適切なタイトルが思いつきませんでした。
IPrintPipelinePropertyBag インターフェイスには、適切に「プロパティ バッグにプロパティを追加する」メソッド AddProperty があります。
http://msdn.microsoft.com/en-us/library/aa506384.aspx
AddProperty([in、string] const wchar_t *pszname、[in] const variant *pvar);
次のコードを使用して、プロパティ バッグに文字列を追加します。
CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);
ただし、作成された CComBSTR と CComVariant がしばらくするとスコープ外になることは明らかです。PropertyBag が文字列を処理して独自のコピーを作成するかどうかはわかりません。VARIANT 内にはあらゆる種類のものを保存できるため、このようなことは起こらないはずです。
文字列が処理されないと仮定すると、私の質問は、COM でこれを行うパターンは何ですか?割り当てられた文字列を含む VARIANT を渡し、AddProperty を呼び出したスレッドが最初に終了した場合でもその文字列を他のスレッドで使用できるようにし、文字列の割り当てを適切に解除するにはどうすればよいでしょうか?
解決
文字列または VARIANT を使用して COM 関数を呼び出す場合、ほとんどの場合、必要な唯一の保証は、呼び出し自体を通じてそれらのオブジェクトが使用可能であることです。呼び出し後、オブジェクト自体がデータのコピーを作成します。たとえば、VARIANT では、文字列をコピーし、COM オブジェクトをコピーする (参照カウントを増やす) VariantCopy 関数が使用される可能性が高くなります。唯一心配すべきことは、VARIANT で実際のインターフェイスを渡す場合です。その場合、インターフェイスは適切に参照カウントされ、それに応じて QueryInterface、AddRef、および Release がすべて実装される必要があります。また、参照カウントが 0 に達する前にそのオブジェクトの割り当てを解除しないでください ;)
編集:ああ、COM プログラミングについてさらに詳しく知りたい場合は、必ず「Don Box」の「Essential COM」を入手してください。ドン・ボックスは の COM の第一人者です。この本は、COM などについて知りたいことのほぼすべてを教えてくれます ;)