user_marshal 특성
user_marshal ACF 특성은 대상 언어(userm-type)의 명명된 로컬 형식을 클라이언트와 서버 간에 전송되는 전송 형식(유선 형식)과 연결합니다.
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);
-
userm-type
-
마샬링할 사용자 데이터 형식의 식별자를 지정합니다. userm-type은 전송할 수 없으며 MIDL 컴파일러에 알려진 형식일 필요는 없습니다.
-
wire-type
-
클라이언트와 서버 간에 실제로 전송되는 명명된 전송 데이터 형식을 지정합니다. 와이어 형식은 MIDL 기본 형식, 미리 정의된 형식 또는 네트워크를 통해 전송될 수 있는 형식의 형식 식별자여야 합니다.
-
pFlags
-
플래그 필드( unsignedlong)에 대한 포인터를 지정합니다. 상위 단어는 부동 소수점, big 또는 little-endian 및 문자 표현에 대해 DCE에서 정의한 대로 NDR 데이터 표현 플래그를 지정합니다. 하위 단어는 마샬링 컨텍스트 플래그를 지정합니다. 플래그의 정확한 레이아웃은 type_UserSize 함수에 설명되어 있습니다.
-
StartingSize
-
개체 크기를 조정하기 전에 현재 버퍼 크기(오프셋)를 지정합니다.
-
pUser_typeObject
-
userm_type 개체에 대한 포인터를 지정합니다.
-
Buffer
-
현재 버퍼 포인터를 지정합니다.
명명된 각 로컬 형식인 userm-type에는 형식의 와이어 표현을 정의하는 와이어 형식 과 일대일 대응이 있습니다. 마샬링할 데이터의 크기를 조정하고, 데이터를 마샬링 및 마샬링 해제하고, 메모리를 해제하는 루틴을 제공해야 합니다. 이러한 루틴에 대한 자세한 내용은 user_marshal 특성을 참조하세요. 데이터에 user_marshal 또는 [ wire_marshal]로 정의된 포함된 형식이 있는 경우 포함된 형식의 서비스도 관리해야 합니다.
와이어 형식은 인터페이스 포인터 또는 전체 포인터일 수 없습니다. 와이어 형식에는 잘 정의된 메모리 크기가 있어야 합니다. 지정된 와이어 형식을 마샬링하는 방법에 대한 자세한 내용은 user_marshal 및 wire_marshal 대한 마샬링 규칙을 참조하세요.
userm-type은 직접 마샬링할 수 있으므로 인터페이스 포인터가 아니어야 합니다. 사용자 유형이 전체 포인터인 경우 별칭을 직접 관리해야 합니다.
// 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);