Pergunta

OK, então eu realmente não podia pensar em um título a propósito que resume isso.

A interface IPrintPipelinePropertyBag tem o AddProperty método que apropriadamente o suficiente "adiciona uma propriedade a um saco de propriedade."

http://msdn.microsoft. com / en-us / library / aa506384.aspx

AddProperty ([in, string] const wchar_t * pszName, [in] const VARIANT * pVar);

Nós usamos o seguinte código para adicionar uma cadeia para o saco da propriedade.

CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);

É bastante óbvio, porém, que o CComBSTR e CComVariant que é criado sai do escopo depois de um tempo. Eu não tenho certeza se o PropertyBag lida com a corda e faz a sua própria cópia. Uma vez que pode armazenar todos os tipos de coisas dentro de um VARIANT, isso não deve ser o caso.

Assumindo que a cadeia não é tratada, a minha pergunta é, qual é o padrão para fazer isso em COM? Como devo passar um VARIANT que contém uma string alocada, fazer essa string disponível para outros segmentos mesmo que o thread que chamou AddProperty morreu primeiro, e de-alocar a seqüência corretamente?

Foi útil?

Solução

Quando você chamar uma função COM com cordas ou variantes na maioria dos casos, a única garantuee necessário é que esses objetos estão disponíveis em toda a própria chamada. Após a chamada, o objeto em si é responsável por fazer cópias dos dados. Por exemplo VARIANT de provavelmente irá usar a função VariantCopy que irá copiar cordas, copiar objetos COM (contagem de referência aumenta). A única coisa que você deve se preocupar é quando você passar uma interface real no VARIANT: nesse caso, a interface deve ser devidamente referência contada, e QueryInterface, AddRef e lançamento devem todos ser aplicada em conformidade. E nunca desalocar esse objeto antes de a contagem de referência chega a 0;)

EDIT: Ah, e se você quiser saber mais sobre a programação COM, certifique-se de obter "COM Essencial" por "Don Box". Don Box é o COM guru, e que o livro vai ensinar-lhe quase tudo que você poderia querer saber sobre COM e mais;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top