9

OK、それで私はこれを要約する適切なタイトルを本当に考えることができませんでした。

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を呼び出したスレッドが最初に停止した場合でも、その文字列を他のスレッドで使用できるようにし、文字列の割り当てを適切に解除するにはどうすればよいですか?

4

1 に答える 1

14

ほとんどの場合、文字列またはVARIANTを使用してCOM関数を呼​​び出す場合、必要な保証は、これらのオブジェクトが呼び出し自体全体で使用可能であることだけです。呼び出し後、オブジェクト自体がデータのコピーを作成する責任があります。たとえば、VARIANTは、文字列をコピーし、COMオブジェクトをコピーする(参照カウントを増やす)VariantCopy関数を使用する可能性があります。心配する必要があるのは、VARIANTで実際のインターフェイスを渡すときだけです。その場合、インターフェイスは適切に参照カウントされ、QueryInterface、AddRef、およびReleaseはすべてそれに応じて実装される必要があります。また、参照カウントが0に達する前に、そのオブジェクトの割り当てを解除しないでください;)

編集:ああ、COMプログラミングについてもっと知りたい場合は、必ず「DonBox」の「EssentialCOM」を入手してください。ドンボックスはCOMの第一人者であり、その本は COMなどについて知りたいと思うほとんどすべてのことを教えてくれます;)

于 2008-11-04T09:48:18.007 に答える