Вопрос

Хорошо, поэтому я не мог придумать подходящее название, которое резюмирует это.

Интерфейс IPrintPipelinePropertyBag имеет метод AddProperty, который достаточно точно " добавляет свойство в пакет свойств. "

http://msdn.microsoft. ком / EN-US / библиотека / 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, умер первым, и правильно отменить выделение строки?

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top