Atributo transmit_as
O atributo [transmit_as] instrui o compilador a associar type-id*,* que é um tipo apresentado que os aplicativos cliente e servidor manipulam, com um tipo xmit-type transmitido.
typedef [transmit_as(xmit-type) [[ , type-attribute-list ]] ] type-specifier declarator-list;
void __RPC_USER type-id_to_xmit (
type-id __RPC_FAR *,
xmit-type __RPC_FAR * __RPC_FAR *);
void __RPC_USER type-id_from_xmit (
xmit-type __RPC_FAR *,
type-id __RPC_FAR *);
void __RPC_USER type-id_free_inst (
type-id __RPC_FAR *);
void __RPC_USER type-id_free_xmit (
xmit-type__RPC_FAR *);
-
xmit-type
-
Especifica o tipo de dados que é transmitido entre cliente e servidor.
-
type-attribute-list
-
Especifica um ou mais atributos que se aplicam ao tipo . Os atributos de tipo válidos incluem [handle], [switch_type]; o atributo de ponteiro [ref], [unique]ou [ptr]; e os atributos de uso [cadeia de caracteres] e [ignorar]. Separe vários atributos com vírgulas.
-
type-specifier
-
Especifica um tipo base, struct, união, tipo de enumeração ou identificador de tipo. Uma especificação de armazenamento opcional pode preceder o especificador de tipo.
-
declarator-list
-
Especifica declaradores C padrão, como identificadores, declaradores de ponteiro e declaradores de matriz. Para obter mais informações, consulte Atributos de matriz e Sized-Pointer, matrizes e matrizes e ponteiros. A lista de declaradores consiste em um ou mais declaradores separados por vírgulas. O declarador de parâmetro no declarador de função, como o nome do parâmetro, é opcional.
-
type-id
-
Especifica o nome do tipo de dados apresentado aos aplicativos cliente e servidor.
Para usar o atributo [transmit_as] , o usuário deve fornecer rotinas que convertem dados entre os tipos apresentados e transmitidos; essas rotinas também devem liberar memória usada para armazenar os dados convertidos. O atributo [transmit_as] instrui os stubs a chamar as rotinas de conversão fornecidas pelo usuário.
O tipo xmit-type transmitido deve resolve a um tipo base MIDL, tipo predefinido ou um identificador de tipo. Para obter mais informações, consulte Tipos base MIDL.
O usuário deve fornecer as rotinas a seguir.
Nome de rotina | Descrição |
---|---|
type-id**_to_xmit** | Converte dados do tipo apresentado para o tipo transmitido. Essa rotina aloca memória para o tipo transmitido e para todos os dados referenciados por ponteiros no tipo transmitido. |
type-id**_from_xmit** | Converte dados do tipo transmitido para o tipo apresentado. Essa rotina é responsável por alocar memória para dados referenciados por ponteiros no tipo apresentado. O RPC aloca memória para o próprio tipo. |
type-id**_free_inst** | Libera memória alocada para dados referenciados por ponteiros no tipo apresentado. O RPC libera memória para o próprio tipo. |
type-id**_free_xmit** | Libera o armazenamento usado pelo chamador para o tipo transmitido e para dados referenciados por ponteiros no tipo transmitido. |
O stub do cliente chama type-id**_to_xmit** para alocar espaço para o tipo transmitido e converter os dados em objetos do tipo xmit-type. O stub do servidor aloca espaço para o tipo de dados original e chama type-id**_from_xmit** para converter os dados de seu tipo transmitido para o tipo apresentado.
Após o retorno do código do aplicativo, o stub do servidor chama type-id**_free_inst** para desalocar o armazenamento para type-id no lado do servidor. O stub do cliente chama type-id**_free_xmit** para desalocar o armazenamento do tipo xmit no lado do cliente.
Os seguintes tipos não podem ter um atributo [transmit_as] :
- Identificadores de contexto (tipos com o atributo de tipo [context_handle] e tipos que são usados como parâmetros com o atributo [context_handle] )
- Tipos que são pipes ou derivados de pipes
- Tipos de dados usados como o tipo base de uma definição de pipe
- Parâmetros que são ponteiros ou resolve para ponteiros
- Parâmetros compatíveis, variáveis ou matrizes abertas
- Estruturas que contêm matrizes em conformidade
- O tipo predefinido handle_t, void
Os tipos transmitidos devem estar em conformidade com as seguintes restrições:
- Eles não devem ser ponteiros ou conter ponteiros.
- Eles não devem ser pipes ou conter pipes.
typedef struct _TREE_NODE_TYPE
{
unsigned short data;
struct _TREE_NODE_TYPE * left;
struct _TREE_NODE_TYPE * right;
} TREE_NODE_TYPE;
typedef [transmit_as(TREE_XMIT_TYPE)] TREE_NODE_TYPE * TREE_TYPE;
void __RPC_USER TREE_TYPE_to_xmit(
TREE_TYPE __RPC_FAR * ,
TREE_XMIT_TYPE __RPC_FAR * __RPC_FAR *);
void __RPC_USER TREE_TYPE_from_xmit (
TREE_XMIT_TYPE __RPC_FAR *,
TREE_TYPE __RPC_FAR *);
void __RPC_USER TREE_TYPE_free_inst(
TREE_TYPE __RPC_FAR *);
void __RPC_USER TREE_TYPE_free_xmit(
TREE_XMIT_TYPE __RPC_FAR *);