Función RpcSsContextLockExclusive (rpcasync.h)

La función RpcSsContextLockExclusive permite a una aplicación empezar a usar un identificador de contexto en modo exclusivo. La función RpcSsContextLockExclusive permite que los métodos declarados como no serializados (compartidos) en el archivo IDL o ACF se cambien dinámicamente para tener acceso a un identificador de contexto en modo serializado (exclusivo).

Sintaxis

RPC_STATUS RpcSsContextLockExclusive(
  [in] RPC_BINDING_HANDLE ServerBindingHandle,
  [in] PVOID              UserContext
);

Parámetros

[in] ServerBindingHandle

Manipulador de enlace en el servidor que representa un enlace a un cliente. El servidor suplanta al cliente indicado por este identificador. Si se especifica un valor de cero, el servidor suplanta al cliente que sirve este subproceso de servidor.

[in] UserContext

Puntero pasado a la rutina de administrador o servidor por RPC. Vea la sección Comentarios.

En el caso de los identificadores de contexto de solo salida, la función RpcSsContextLockExclusive no realiza ninguna operación.

Valor devuelto

Devuelve RPC_S_OK tras la ejecución correcta, lo que indica que el subproceso ahora tiene acceso al identificador de contexto en modo exclusivo. Devuelve ERROR_MORE_WRITES cuando varios subprocesos intentan un bloqueo exclusivo en el identificador de contexto. Vea la sección Comentarios.

Nota Para obtener una lista de códigos de error válidos, vea Rpc Return Values.
 

Comentarios

Modificar si un identificador de contexto se serializa o no puede ser útil para las aplicaciones que determinan si se debe cerrar un identificador de contexto en función de las condiciones detectadas durante la ejecución. Para cambiar un identificador de contexto de serializado (exclusivo) a noserializado (compartido), use la función RpcSsContextLockShared .

Para el parámetro UserContext , si la rutina del administrador recibe un puntero a un identificador de contexto, debe pasar la función RpcSsContextLockExclusive el mismo puntero que recibió de RPC. Si la rutina del administrador recibe el propio identificador de contexto, que es típico para los identificadores de contexto [in], debe pasar el propio identificador de contexto a la función RpcSsContextLockExclusive . En el ejemplo de código siguiente se muestra lo siguiente:

void _UseShared(
    /* [in] */ handle_t Binding,
    //...
    /* [in] */ TestContextHandleShared *Ctx,
    //...
    )
{
    //...
    RpcStatus = RpcSsContextLockExclusive(Binding, Ctx);
    //...
}

Si una rutina de administrador toma varios identificadores de contexto [in, out] como argumento, RPC proporciona a la rutina del administrador un puntero al identificador de contexto, no al propio identificador de contexto. Se garantiza que el puntero es único y, por lo tanto, pasarlo a la función RpcSsContextLockExclusive es inequívoca. Sin embargo, si una función toma varios identificadores de contexto [in] solo, RPC proporciona a la rutina del administrador el propio identificador de contexto. Por lo tanto, es posible que el identificador de contexto no sea único. En este caso, RPC ejecuta esta función en el primer identificador de contexto con el valor especificado.

Los métodos no deben modificar un identificador de contexto cuando se encuentra en modo compartido. Llamar a la función RpcSsContextLockExclusive no elimina un bloqueo de lector en el identificador de contexto especificado; esto garantiza un identificador de contexto sin cambios para las aplicaciones que no modifican los identificadores de contexto en modo compartido. Si dos subprocesos intentan obtener un bloqueo exclusivo en el mismo identificador de contexto llamando a la función RpcSsContextLockExclusive al mismo tiempo, se devuelve un subproceso elegido arbitrariamente RPC_S_OK y el otro se devuelve ERROR_MORE_WRITES. El subproceso que se devuelve ERROR_MORE_WRITES recibe un bloqueo exclusivo, pero su bloqueo de lector en el identificador de contexto se pierde al devolverlo. Un autor de la llamada que recibe ERROR_MORE_WRITES no debe asumir nada sobre el identificador de contexto al devolver la función RpcSsContextLockExclusive , ya que puede que se haya destruido.

Las llamadas asincrónicas no deben usar la función RpcSsContextLockExclusive en el mismo objeto de llamada desde más de un subproceso a la vez.

La función RpcSsContextLockExclusive puede producir un error debido a condiciones de memoria insuficiente y, por tanto, los servidores RPC deben estar preparados para controlar estos errores.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado rpcasync.h (include Rpc.h)
Library Rpcrt4.lib
Archivo DLL Rpcrt4.dll

Consulte también

RpcSsContextLockShared

context_handle

context_handle_noserialize

context_handle_serialize