2008-11-04 12 views
9

OK, así que no podría pensar en un título apropos que lo resuma.COM, VARIANT que contiene BSTR. ¿Quién asigna?

La interfaz IPrintPipelinePropertyBag tiene el método AddProperty que acertadamente "agrega una propiedad a una bolsa de propiedades".

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

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

Utilizamos el siguiente código para agregar una cadena a la bolsa de la propiedad.

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

que es bastante obvio, sin embargo, que el CComBSTR y CComVariant que se crea se salen del ámbito después de un tiempo. No estoy seguro si PropertyBag maneja la cadena y hace su propia copia. Como podemos almacenar todo tipo de cosas dentro de un VARIANT, este no debería ser el caso.

Suponiendo que la cadena no se maneja, mi pregunta es, ¿cuál es el patrón para hacer esto en COM? ¿Cómo debo pasar un VARIANT que contiene una cadena asignada, hacer que esa cadena esté disponible para otros hilos, incluso si el hilo que llamó AddProperty murió primero, y desasignar la cadena correctamente?

Respuesta

14

Cuando llama a una función COM con cadenas o VARIANTES en la mayoría de los casos, la única garantía necesaria es que esos objetos estén disponibles durante toda la llamada. Después de la llamada, el objeto en sí es responsable de hacer copias de los datos. Por ejemplo, lo más probable es que VARIANT use la función VariantCopy que copiará cadenas, copiará objetos COM (aumenta el recuento de referencias). Lo único que debe preocuparse es cuando pasa una interfaz real en el VARIANT: en ese caso, la interfaz debe contar con una referencia adecuada, y QueryInterface, AddRef y Release deben implementarse en consecuencia. Y nunca desasigne ese objeto antes de que el recuento de referencias llegue a 0;)

EDITAR: Ah, y si desea obtener más información sobre la programación COM, asegúrese de obtener "COM esencial" de "Don Box". Don Box es COM gurú, y ese libro le enseñará casi cualquier cosa que quiera saber sobre COM y más;)

Cuestiones relacionadas