2012-09-21 28 views
5

Voy a través de algún legado código C++ hacer frente a la biblioteca de Windows Imaging Component y yo observado esto:Pasar un CComPtr a una función con un prototipo puntero prima

void setProperties(IPropertyBag2* const pBag) 
{ 
    pBag->Write(...); 
} 

void other_function() 
{ 
    CComPtr<IPropertyBag2> pBag; 
    //Code to initialize pBag 
    setProperties(pBag); 
} 

El método setProperties simplemente escribe un montón de propiedades a la bolsa de propiedades. El código se compila y funciona bien porque creo que llama al operador de tipografía correspondiente.

Mi pregunta es si se recomienda tal interfaz o si hay una mejor manera de pasar el puntero. Por ejemplo, ¿hay alguna diferencia (en términos de seguridad/rendimiento) si la firma se cambió a:

void setProperties(const CComPtr<IPropertyBag2>& pBag) 

Respuesta

2

Los punteros de interfaz en bruto son la forma canónica de trabajar con objetos COM. También son los más flexibles. Usar una referencia a CComPtr lo vinculará a usar CComPtr siempre.

Cualquier puntero COM, incluso uno tonto, es automáticamente un puntero inteligente ya que el objeto implementa AddRef y Release. Si la función no conserva una copia del puntero, no hay necesidad de preocuparse por eso.

El tipo CComPtr se convertirá automáticamente en un puntero sin formato para mayor comodidad.

+3

El uso de un parámetro CComPtr no lo vinculará a utilizar CComPtr siempre, porque los constructores CComPtr no son explícitos. Y los punteros de interfaz en bruto no son punteros inteligentes. Olvidarse de liberar un objeto hará que se filtre. Tiene todos los mismos problemas que olvidarse de 'borrar' la memoria asignada con' nuevo'. – user1610015

1

No hay muchas ventajas de utilizar un parámetro CComPtr (a menos que sea no constante y que' voy a modificarlo). CComPtr es más útil para variables locales y variables de instancia.

Pero está bien hacerlo, aunque solo sea por cuestión de estilo/coherencia.

Cuestiones relacionadas