¿Por qué existe IClassFactory :: LockServer cuando me parece que IClassFactory :: AddRef/IClassFactory :: Release puede lograr el mismo objetivo?¿Cuál es el objetivo de IClassFactory :: LockServer?
Respuesta
Esto se explica en detalle en el libro de Don Box Essential COM.
AddRef/Release
en IClassFactory Las interfaces de los objetos de clase a menudo son métodos vacíos en servidores COM fuera de proceso. Esto se debe a que el servidor mantiene una referencia interna al objeto de clase cuando llama al CoRegisterClassObject
y, por lo tanto, la implementación del servidor en proceso "normal" de AddRef/Release
daría como resultado que el recuento de referencias en el objeto de clase siempre exceda uno, y el servidor no sabría cuándo llamar al CoRevokeClassObject
.
El tiempo de ejecución COM llama al IClassFactory::LockServer
cuando establece una referencia externa a un objeto de clase después de una llamada al CoGetClassObject
. De esta forma, la vida útil del proceso del servidor puede controlarse adecuadamente en función de la existencia o no de referencias externas.
No estoy seguro, pero creo que la idea es que puede llamar a CoGetClassObject para obtener la fábrica de clases, bloquearla a través de su interfaz IClassFactory, y luego liberar la interfaz. Más tarde, cuando vuelva a llamar a CoGetClassFactory para la misma clase, dado que se ha bloqueado en la memoria, el sistema simplemente devolverá el mismo objeto de fábrica en lugar de crear uno nuevo. Esto podría mejorar el rendimiento donde creas muchos objetos de esa clase.
Sí, puede lograr lo mismo sujetando el puntero de la interfaz IClassFactory. Pero al bloquear el objeto de fábrica cuando se inicia la aplicación y desbloquearlo al apagarlo, no tiene que mantener un puntero de interfaz en algún lugar (en una variable global o lo que sea)
Sospecho que la razón por la que introdujeron IClassFactory: : LockServer fue que bloquear el servidor no es semánticamente lo mismo que AddRef'ing it. AddRef/Release es para la administración normal del ciclo de vida de los objetos y tiene una semántica claramente definida. Bloquear el servidor es un ajuste de rendimiento.
- 1. ¿Cuál es el objetivo de ContentResolver.bulkInsert (..)?
- 2. ¿Cuál es el objetivo de JAAS
- 3. ¿Cuál es el objetivo del estándar C99?
- 4. ¿Cuál es el objetivo del andamio?
- 5. ¿Cuál es el significado de #define en el objetivo C?
- 6. ¿Cuál es el significado de "mutable" en el objetivo C?
- 7. ¿Cuál es el objetivo de la declaración de rigor?
- 8. ¿cuál es la diferencia entre el objetivo y el proyecto?
- 9. ¿Cuál es el objetivo de la política Anti-Cross-Domain?
- 10. ¿Cuál es el objetivo de la clase StatusBarItem en WPF?
- 11. ¿Cuál es el propósito de la API objetivo y minSDK
- 12. ¿Cuál es el objetivo de "host local", hosts y puertos?
- 13. ¿Cuál es el objetivo de la tabla cataloginventory_stock_status_idx?
- 14. ¿Qué es un "objetivo objetivo"?
- 15. Objetivo-C: ¿Cuál es la diferencia entre forKey y forKeyPath?
- 16. ¿Cuál es la diferencia entre C++, objetivo-c y objetivo-C++?
- 17. Convertir el objetivo C a C# - ¿Cuál es el equivalente de este código?
- 18. ¿Cuál es el mejor método de subprocesamiento en el objetivo C?
- 19. ¿Cuál es el comportamiento de Thread.join() en Java si el objetivo aún no se ha iniciado?
- 20. ¿Cuál es la diferencia entre el encuadernado dinámico Vs el tipado dinámico en el Objetivo C
- 21. ¿Cuál es el objetivo de las clases ObjectFactory de JAXB 2?
- 22. ¿Cuál es el alcance de una función c definida dentro de la clase objetivo-c?
- 23. ¿Qué es "->" en el Objetivo C?
- 24. ¿Qué es dealloc en el objetivo C
- 25. ¿cuál es la diferencia entre la compatibilidad con el origen y el objetivo?
- 26. ¿Cuál es la mejor manera de ir en el largo plazo: C, objetivo C o C++?
- 27. ¿Cuál es el objetivo de este C# Dictionary <,> optimización?
- 28. ¿Cuál es el objetivo de XML <? ?> tokens? Por lo general,
- 29. Cuál es la diferencia entre "Objetivo de implementación" y "Objetivo de implementación de iOS" en Xcode 4
- 30. ¿Cuál es el punto de make_heap?
Buena idea para buscar en ese libro ... ¿por qué no pensé en eso! –