¿CoCreateInstance llama automáticamente a AddRef en la interfaz que estoy creando o debo llamarlo luego?En COM: ¿debería llamar a AddRef después de CoCreateInstance?
Respuesta
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.
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á.
Una excepción a la regla: CComObject <> :: CreateInstance() NO realiza un AddRef. Debe hacer eso después de llamarlo.
- 1. ¿Debería llamar siempre a Page.IsValid?
- 2. SPWeb.Site, ¿debería llamar a Dispose() en él?
- 3. ¿Por qué debería aprender COM?
- 4. ¿debo llamar a close() después de urllib.urlopen()?
- 5. ¿Cómo llamar a un método COM complejo de PowerShell?
- 6. Llamar a RNGCrypto desde clase DOTNET de COM desde PHP
- 7. ¿Llamar a C# desde C++ nativo, sin/clr o COM?
- 8. ¿Cómo recuperar la ID de la interfaz de una clase COM para que se pueda pasar a CoCreateInstance?
- 9. Llamar a un COM + ServicedComponent remoto desde un cliente C#
- 10. ¿Debería un repositorio llamar a otro repositorio? ¿O debería un repositorio llamar a una capa de servicio?
- 11. ¿Debo llamar a EndInvoke después de un tiempo de espera?
- 12. ¿Cuándo debería usar & para llamar a una subrutina de Perl?
- 13. ¿Se puede llamar a un objeto COM .NET 2.0 desde una aplicación web ASP.NET 1.1?
- 14. cellForRowAtIndexPath no se llama a veces después de llamar a numberOfRowsInSection al llamar a reloadData
- 15. Cerrar un NetworkStream después de llamar a BeginRead() en C#
- 16. ¿Debería un método de clase modificadora guardarse o ser llamado explícitamente después de llamar al método?
- 17. Después de llamar a chrome.tabs.query, los resultados no están disponibles
- 18. Cómo llamar a la función jquery después de llamar a wicket ajax botón de enviar
- 19. Llamar a un ensamblaje x64 a través de COM desde una aplicación de 32 bits
- 20. ¿Cómo sabe un cmdlet cuándo debería llamar realmente a WriteVerbose()?
- 21. ¿Debería llamar a ReleaseStringUTFChars si GetStringUTFChars devolvió una copia?
- 22. ¿Debería llamar al [supermétododeperiodo] después de mi propio código o antes?
- 23. apagado de Tomcat MUY lento después de llamar a shutdown.sh?
- 24. CoCreateInstance que devuelve E_NOINTERFACE aunque se encuentra la interfaz
- 25. Necesito llamar a HttpURLConnection.disconnect después de terminar de usarlo
- 26. Inicialización de un puntero inmediatamente después de llamar a deleteLater()
- 27. Manejar eventos C# COM en C++
- 28. El cargador no se inicia después de llamar a initLoader()?
- 29. El programa se cuelga después de llamar a Dispose()
- 30. Llamar a un evento después de cargar una pestaña jquery
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 (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