Atributo transmit_as
El atributo [transmit_as] ofrece una manera de controlar el cálculo de referencias de datos sin preocuparse por la serialización de datos en un nivel bajo, es decir, sin preocuparse por los tamaños de datos o el intercambio de bytes en un entorno heterogéneo. Al permitirle reducir la cantidad de datos transmitidos a través de la red, el atributo [transmit_as] puede hacer que la aplicación sea más eficaz.
Use el atributo [transmit_as] para especificar un tipo de datos que los códigos auxiliares RPC transmitirán a través de la red en lugar de usar el tipo de datos proporcionado por la aplicación. Proporciona rutinas que convierten el tipo de datos en y desde el tipo que se usa para la transmisión. También debe proporcionar rutinas para liberar la memoria utilizada para el tipo de datos y el tipo transmitido. Por ejemplo, lo siguiente define xmit_type como el tipo de datos transmitido para todos los datos de la aplicación especificados como de tipo type_spec:
typedef [transmit_as (xmit_type)] type_spec type;
En la tabla siguiente se describen los cuatro nombres de rutina proporcionados por el programador. El tipo es el tipo de datos conocido para la aplicación y xmit_type es el tipo de datos que se usa para la transmisión.
Rutina | Descripción |
---|---|
type_to_xmit | Asigna un objeto del tipo transmitido y convierte del tipo de aplicación al tipo transmitido a través de la red (llamador y objeto llamado). |
Type_from_xmit | Convierte del tipo transmitido al tipo de aplicación (llamador y objeto llamado). |
Type_free_inst | Libera los recursos usados por el tipo de aplicación (objeto denominado solo). |
Type_free_xmit | Libera el almacenamiento devuelto por el tipo*_*to_xmit rutina (llamador y objeto llamado). |
Aparte de estas cuatro funciones proporcionadas por el programador, la aplicación no manipula el tipo transmitido. El tipo transmitido solo se define para mover datos a través de la red. Después de convertir los datos en el tipo utilizado por la aplicación, se libera la memoria utilizada por el tipo transmitido.
Estas rutinas proporcionadas por el programador las proporciona el cliente o la aplicación de servidor en función de los atributos direccionales. Si el parámetro solo es [in], el cliente transmite al servidor. El cliente necesita las funciones type_to_xmit y type_free_xmit . El servidor necesita las funciones type_from_xmit y type_free_inst . Para un parámetro [out]-only, el servidor transmite al cliente. La aplicación de servidor debe implementar las funciones type_to_xmit y type_free_xmit , mientras que el programa cliente debe proporcionar la función type_from_xmit . En el caso de los objetos de xmit_type temporales, el código auxiliar llamará a type*_*free_xmit para liberar cualquier memoria asignada por una llamada a type_to_xmit.
Algunas directrices se aplican a la instancia de tipo de aplicación. Si el tipo de aplicación es un puntero o contiene un puntero, la rutina type_from_xmit debe asignar memoria para los datos a los que apuntan los punteros (el propio objeto de tipo de aplicación lo manipula el código auxiliar de la manera habitual).
Para los parámetros [out] y [in, out] o uno de sus componentes, de un tipo que contiene el atributo [transmit_as], se llama automáticamente a la rutina type_free_inst para los objetos de datos que tienen el atributo . En los parámetros , se llama a la rutina type_free_inst solo si se ha aplicado el atributo [transmit_as] al parámetro . Si el atributo se ha aplicado a los componentes del parámetro , no se llama a la rutina type_free_inst . No hay llamadas de liberación para los datos incrustados y la llamada de más de uno (relacionada con el atributo de nivel superior) para un en solo parámetro.
Efectivo con MIDL 2.0, tanto el cliente como el servidor deben proporcionar las cuatro funciones. Por ejemplo, una lista vinculada se puede transmitir como una matriz de tamaño. La rutina type_to_xmit recorre la lista vinculada y copia los datos ordenados en una matriz. Los elementos de matriz se ordenan para que no sea necesario transmitir los muchos punteros asociados a la estructura de lista. La rutina type_from_xmit lee la matriz y coloca sus elementos en una estructura de lista vinculada.
La lista vinculada doble (DOUBLE_LINK_LIST) incluye datos y punteros a los elementos de lista anteriores y siguientes:
typedef struct _DOUBLE_LINK_LIST
{
short sNumber;
struct _DOUBLE_LINK_LIST * pNext;
struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;
En lugar de enviar la estructura compleja, se puede usar el atributo [transmit_as] para enviarlo a través de la red como una matriz. La secuencia de elementos de la matriz conserva el orden de los elementos de la lista a un costo menor:
typedef struct _DOUBLE_XMIT_TYPE
{
short sSize;
[size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;
El atributo [transmit_as] aparece en el archivo IDL:
typedef [transmit_as(DOUBLE_XMIT_TYPE)] DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;
En el ejemplo siguiente, ModifyListProc define el parámetro de tipo DOUBLE_LINK_TYPE como un parámetro [in, out] :
void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)
Las cuatro funciones definidas por el programador usan el nombre del tipo en los nombres de función y usan los tipos presentados y transmitidos como tipos de parámetro, según sea necesario:
void __RPC_USER DOUBLE_LINK_TYPE_to_xmit (
DOUBLE_LINK_TYPE __RPC_FAR * pList,
DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);
void __RPC_USER DOUBLE_LINK_TYPE_from_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_inst (
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray);