2011-02-15 11 views

Respuesta

5

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.

+0

Buena idea para buscar en ese libro ... ¿por qué no pensé en eso! –

3

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.

Cuestiones relacionadas