Función CoLockObjectExternal (combaseapi.h)
Se llama a para bloquear un objeto para asegurarse de que permanece en memoria o para liberar este bloqueo.
Sintaxis
HRESULT CoLockObjectExternal(
[in] LPUNKNOWN pUnk,
[in] BOOL fLock,
[in] BOOL fLastUnlockReleases
);
Parámetros
[in] pUnk
Puntero a la interfaz IUnknown del objeto que se va a bloquear o desbloquear.
[in] fLock
Indica si el objeto se va a bloquear o liberar. Si este parámetro es TRUE, el objeto se mantiene en memoria, independientemente de las operaciones addref/release , los registros o las revocaciones. Si este parámetro es FALSE, se libera el bloqueo establecido previamente con una llamada a esta función.
[in] fLastUnlockReleases
Si el bloqueo es la última referencia que se supone que mantiene activo un objeto, especifique TRUE para liberar todos los punteros al objeto (puede haber otras referencias que no se supone que lo mantengan activo). De lo contrario, especifique FALSE.
Si fLock es TRUE, se omite este parámetro.
Valor devuelto
Esta función puede devolver los valores devueltos estándar E_INVALIDARG, E_OUTOFMEMORY, E_UNEXPECTED y S_OK.
Comentarios
Se debe llamar a la función CoLockObjectExternal en el proceso en el que reside realmente el objeto (el proceso EXE, no el proceso en el que se pueden cargar los controladores).
La función CoLockObjectExternal impide que el recuento de referencias de un objeto vaya a cero, lo que lo "bloquea" hasta que se libere el bloqueo. La misma función (con parámetros diferentes) libera el bloqueo. El bloqueo se implementa haciendo que el sistema llame a IUnknown::AddRef en el objeto . A continuación, el sistema espera a llamar a IUnknown::Release en el objeto hasta que una llamada posterior a CoLockObjectExternal con fLock establecido enFALSE. Esta función se puede usar para mantener un recuento de referencias en el objeto en nombre del usuario final, ya que actúa fuera del objeto, como hace el usuario.
El usuario final tiene control explícito sobre la duración de una aplicación, incluso si hay bloqueos externos en ella. Es decir, si un usuario decide cerrar la aplicación, debe apagarse. En presencia de bloqueos externos (como el bloqueo establecido por CoLockObjectExternal), la aplicación puede llamar a la función CoDisconnectObject para forzar que estas conexiones se cierren antes del apagado.
Al llamar a CoLockObjectExternal , se establece un bloqueo seguro en un objeto . Un bloqueo fuerte mantiene un objeto en memoria, mientras que un bloqueo débil no. Se requieren bloqueos seguros, por ejemplo, durante una actualización silenciosa de una inserción OLE. El contenedor del objeto incrustado debe permanecer en memoria hasta que se complete el proceso de actualización. También debe haber un bloqueo seguro en un objeto de aplicación para asegurarse de que la aplicación permanece activa hasta que haya terminado de proporcionar servicios a sus clientes. Todas las referencias externas colocan un bloqueo de referencia seguro en un objeto .
Normalmente se llama a la función CoLockObjectExternal en las situaciones siguientes:
- Los servidores de objetos deben llamar a CoLockObjectExternal con fLock y fLastLockReleases establecidos en TRUE cuando se vuelven visibles. Esta llamada crea un bloqueo seguro en nombre del usuario. Cuando la aplicación se cierre, libere el bloqueo con una llamada a CoLockObjectExternal, estableciendo fLock enFALSE y fLastLockReleases en TRUE.
- También se puede usar una llamada a CoLockObjectExternal en el servidor en la implementación de IOleContainer::LockContainer.
A menos que una aplicación administre todos los aspectos de su aplicación y cierre de documentos por completo con llamadas a CoLockObjectExternal, el contenedor debe mantener un recuento de bloqueos privado en LockContainer para que salga cuando el recuento de bloqueos alcance cero y el contenedor sea invisible. Mantener todos los aspectos del apagado y, por tanto, evitar mantener un recuento de bloqueos privados, significa que se debe llamar a CoLockObjectExternal siempre que se produzca una de las condiciones siguientes:
- Se crea un documento y se destruye o se hace visible o invisible.
- El usuario inicia y cierra una aplicación.
- Se crea y destruye un pseudoobjeto.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 2000 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows 2000 Server [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | combaseapi.h (incluya Objbase.h) |
Library | Ole32.lib |
Archivo DLL | Ole32.dll |