Compartir a través de


Desarrollo de interfaz mediante identificadores de contexto

Normalmente, se crea un identificador de contexto especificando el atributo [context_handle] en una definición de tipo en el archivo IDL. La definición de tipo también especifica implícitamente una rutina de ejecución de contexto, que debe proporcionar. Si la comunicación entre el cliente y el servidor se interrumpe, el tiempo de ejecución del servidor invoca esta rutina para realizar cualquier limpieza necesaria. Para obtener más información sobre las rutinas de ejecución de contexto, vea Rutina de ejecución de contexto de servidor.

Una interfaz que usa un identificador de contexto debe tener un identificador de enlace para el enlace inicial, que debe tener lugar antes de que el servidor pueda devolver un identificador de contexto. Puede usar un identificador de enlace automático, implícito o explícito para crear el enlace y establecer el contexto.

Un identificador de contexto debe ser del tipo void * o de un tipo que se resuelva como void *. El programa de servidor lo convierte en el tipo necesario.

Nota

No se recomienda el uso de [in, out] para los parámetros de identificador de contexto, excepto las rutinas que cierran los identificadores de contexto. Si se usan parámetros marcados como [in, out], no pase un identificador de contexto NULL o no inicializado del cliente al servidor. En su lugar, se debe pasar un puntero NULL a un identificador de contexto. Tenga en cuenta que los parámetros de identificador de contexto marcados [in] no aceptan punteros NULL .

 

El siguiente fragmento de una definición de interfaz de ejemplo muestra cómo una aplicación distribuida puede usar un identificador de contexto para tener un servidor abierto y actualizar un archivo de datos para cada cliente.

La interfaz debe contener una llamada a procedimiento remoto para inicializar el identificador y establecerla en un valor que no sea NULL . En este ejemplo, la función RemoteOpen realiza esta operación. Especifica el identificador de contexto con un atributo direccional [out]. Como alternativa, puede devolver el identificador de contexto como valor devuelto del procedimiento. Sin embargo, en este ejemplo, pasaremos el control de contexto a través de la lista de parámetros.

En este ejemplo, la información de contexto es un identificador de archivo. Realiza un seguimiento de la ubicación actual en el archivo. La interfaz empaqueta el identificador de archivo como un identificador de contexto y lo pasa como un parámetro a las llamadas a procedimientos remotos. Una estructura contiene el nombre de archivo y el identificador de archivo.

/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
 
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
    [in, string] unsigned char * pszFile);
 
void RemoteRead(
    [in] PCONTEXT_HANDLE_TYPE phContext,
    [out, size_is(cbBuf)] unsigned char achBuf[],
    [in, out] short *pcbBuf);
 
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);

La función RemoteOpen crea un identificador de contexto válido que no es NULL . Pasa el identificador de contexto al cliente. Las llamadas a procedimientos remotos posteriores, como RemoteRead, usan el identificador de contexto como en el puntero.

Además del procedimiento remoto que inicializa el identificador de contexto, la interfaz debe contener un procedimiento que libere el contexto del servidor y establezca el identificador de contexto en NULL. En el ejemplo anterior, la función RemoteClose realiza esta operación.