2009-03-14 20 views

Respuesta

23

El contrato con COM es cada vez que se le entrega un objeto de una función como esta, como CoCreateInstance(), QueryInterface() (que es lo que CoCreateInstance() llama), etc, el llamado siempre llama AddRef() antes de regresar, y el que llama (usted) siempre libera() cuando termina.

Puede usar CComPtr <> para simplificar esto, y simplemente hace lo correcto.

Ahora, si necesita pasar este puntero a otro objeto que espera que se pueda utilizar más allá de la duración de su objeto, entonces necesita llamar a AddRef() antes de distribuirlo.

Recomiendo Essential COM by Don Box para leer más sobre este tema.

+2

Aunque tiene 12 años, 'Essential COM' todavía sigue dando. Incluso como un tipo de .NET, todavía vuelvo y me meto en él. – Kev

+1

+1 (ya que no puede ser más) para Essential COM. Debe tener en cuenta que la sección "Gestión de recursos y IUnknown" (p53) le dice todo lo que necesita saber para obtener el recuento de referencias al 100% correcto. – Richard

9

En resumen: No.

Usted no necesita llamar AddRef en su código.

Un contador de referencia que objeto COM tiene es 1 después de CoCreateInstance.

Por lo tanto, si llama al Release, el contador de referencia será 0 y el objeto COM se eliminará.

4

Una excepción a la regla: CComObject <> :: CreateInstance() NO realiza un AddRef. Debe hacer eso después de llamarlo.

Cuestiones relacionadas