COM, VARIANT contendo BStr. Que aloca?
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?
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;)