atributo user_marshal
O atributo ACF user_marshal associa um tipo local nomeado no idioma de destino (tipo de usuário) a um tipo de transferência (tipo de transmissão) que é transferido entre o cliente e o servidor.
typedef [user_marshal(userm_type)] wire-type;
unsigned long __RPC_USER < userm_type >_UserSize(
unsigned long __RPC_FAR *pFlags,
unsigned long StartingSize,
< userm_type > __RPC_FAR * pUser_typeObject );
unsigned char __RPC_FAR * __RPC_USER < userm-type >_UserMarshal(
unsigned long __RPC_FAR *pFlags,
unsigned char __RPC_FAR * Buffer,
< userm_type > __RPC_FAR * pUser_typeObject);
unsigned char __RPC_FAR * __RPC_USER < userm_type >_UserUnmarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * Buffer,
< userm_type > __RPC_FAR * pUser_typeObject);
void __RPC_USER < userm_type >_UserFree(
unsigned long __RPC_FAR * pFlags,
< userm_type > __RPC_FAR * pUser_typeObject);
Parâmetros
-
userm-type
-
Especifica o identificador do tipo de dados do usuário a ser realizado em marshaling. O tipo de usuário não precisa ser transmitível e não precisa ser um tipo conhecido pelo compilador MIDL.
-
tipo de fio
-
Especifica o tipo de dados de transferência nomeado que, na verdade, é transferido entre o cliente e o servidor. O tipo de fio deve ser um tipo base MIDL, um tipo predefinido ou um identificador de tipo de um tipo que pode ser transmitido pela rede.
-
pFlags
-
Especifica um ponteiro para um campo de sinalizador (longsem sinal). A palavra de alta ordem especifica sinalizadores de representação de dados NDR conforme definido pelo DCE para representação de ponto flutuante, big-or little-endian e caractere. A palavra de baixa ordem especifica um sinalizador de contexto de marshaling. O layout exato dos sinalizadores é descrito em A função type_UserSize.
-
StartingSize
-
Especifica o tamanho do buffer atual (deslocamento) antes de dimensionar o objeto.
-
pUser_typeObject
-
Especifica um ponteiro para um objeto de userm_type.
-
Buffer
-
Especifica o ponteiro do buffer atual.
Comentários
Cada tipo local nomeado, tipo de usuário, tem uma correspondência um-para-um com um tipo de fio que define a representação de transmissão do tipo. Você deve fornecer rotinas para dimensionar os dados para marshaling, realizar marshaling e cancelar a gravação dos dados e liberar memória. Para obter mais informações sobre essas rotinas, consulte O atributo user_marshal. Observe que, se houver tipos inseridos em seus dados que também são definidos com user_marshal ou [ [wire_marshal], você também precisará gerenciar a manutenção desses tipos inseridos.
O tipo de fio não pode ser um ponteiro de interface ou um ponteiro completo. O tipo de fio deve ter um tamanho de memória bem definido. Consulte Regras de marshaling para user_marshal e wire_marshal para obter detalhes sobre como realizar marshaling de um determinado tipo de transmissão.
O tipo de usuário não deve ser um ponteiro de interface, pois eles podem ter marshaling diretamente. Se o tipo de usuário for um ponteiro completo, você deverá gerenciar o aliasing por conta própria.
Exemplos
// Marshal a long as a structure containing two shorts.
typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
// ACFL file
typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_BYTE_DATA;
// Marshaling functions:
// Calculate size that converted data will require in the buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserSize(
ULONG __RPC_FAR * pulFlags,
ULONG __RPC_FAR ulStartingSize,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Copy FOUR_BYTE_DATA into buffer as TWO_X_TWO_BYTE_DATA
unsigned long __RPC_USER FOUR_BYTE_DATA_UserMarshal(
ULONG __RPC_FAR *pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Recreate FOUR_BYTE_DATA from TWO_X_TWO_BYTE_DATA in buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserUnmarshal(
ULONG __RPC_FAR * pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Nothing to do here as the engine frees the top node and FOUR_BYTE_DATA is a flat data type.
void __RPC_USER FOUR_BYTE_DATA_UserFree(
ULONG __RPC_FAR * pulFlags,
FOUR_BYTE_DATA __RPC_FAR * pul);
Confira também