Atributo transmit_as
El atributo [transmit_as] ofrece una manera de controlar las 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. Type 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.
El cliente o la aplicación de servidor proporcionan estas rutinas proporcionadas por el programador en función de los atributos direccionales. Si el parámetro es [en] solo, 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. Para los objetos de xmit_type temporales, el código auxiliar llamará a tipo*_*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, el tipo _from_xmit rutina 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 [out] y [in, out] parámetros, o uno de sus componentes, de un tipo que contiene el atributo [transmit_as], se llama automáticamente a la rutina de tipo_free_inst para los objetos de datos que tienen el atributo . Para en parámetros de, solo se llama a la rutina de tipo_free_inst si el atributo [transmit_as] se ha aplicado al parámetro . Si el atributo se ha aplicado a los componentes del parámetro , no se llama al tipo _free_inst rutina. No hay llamadas de liberación para los datos incrustados y la llamada a lo máximo (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, el atributo [transmit_as] se puede usar para enviarlo a través de la red como una matriz. La secuencia de elementos de la matriz conserva la ordenación 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 [in, out] parámetro:
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);