COM, VARIANT, содержащий BSTR. Кто выделяет? - PullRequest
9 голосов
/ 04 ноября 2008

ОК, поэтому я не мог придумать подходящего заголовка, который бы суммировал это.

Интерфейс 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, умер первым, и правильно отменить выделение строки?

1 Ответ

14 голосов
/ 04 ноября 2008

Когда вы вызываете функцию COM со строками или VARIANT, в большинстве случаев единственное, что нужно для гарантии, - это то, что эти объекты доступны во время самого вызова. После вызова сам объект отвечает за создание копий данных. Например, VARIANT, скорее всего, будет использовать функцию VariantCopy, которая будет копировать строки, копировать объекты COM (увеличивает количество ссылок). Единственное, о чем вам следует беспокоиться, это когда вы передаете фактический интерфейс в VARIANT: в этом случае интерфейс должен быть правильно подсчитан, а QueryInterface, AddRef и Release должны быть реализованы соответствующим образом. И никогда не освобождайте этот объект, пока счетчик ссылок не достигнет 0;)

РЕДАКТИРОВАТЬ: О, и если вы хотите узнать больше о программировании COM, не забудьте получить "Essential COM" от "Don Box". Дон Бокс - COM-гуру, и эта книга научит вас почти всему, что вы когда-либо захотите узнать о COM и многом другом;)

...