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

AcF (Arquivo de Configuração de Aplicativo)

Tipos base MIDL

Longas

represent_as

Unsigned

O atributo user_marshal

wire_marshal

NdrGetUserMarshalInfo