wire_marshal 특성
[wire_marshal] 특성은 애플리케이션별 데이터 형식(userm-type) 대신 전송(유선 형식)에 사용할 데이터 형식을 지정합니다.
typedef [wire_marshal(wire_type)] type-specifier userm-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);
매개 변수
-
wire-type
-
클라이언트와 서버 간에 실제로 전송되는 명명된 전송 데이터 형식을 지정합니다. 유선 형식은 MIDL 기본 형식, 미리 정의된 형식 또는 네트워크를 통해 전송될 수 있는 형식의 형식 식별자여야 합니다.
-
type-specifier
-
userm-type이 별칭이 될 형식입니다.
-
userm-type
-
마샬링할 사용자 데이터 형식의 식별자를 지정합니다. 잘 정의된 크기를 갖는 한 형식 지정자가 지정한 모든 형식일 수 있습니다. userm-type은 전송할 수 없지만 MIDL 컴파일러에 알려진 형식이어야 합니다.
-
pFlags
-
플래그 필드( unsignedlong)에 대한 포인터를 지정합니다. 상위 단어는 부동 소수점, big 또는 little-endian 및 문자 표현에 대해 DCE에서 정의한 대로 NDR 데이터 표현 플래그를 지정합니다. 하위 단어는 마샬링 컨텍스트 플래그를 지정합니다. 플래그의 정확한 레이아웃은 type_UserSize 함수에 설명되어 있습니다.
-
StartingSize
-
개체 크기를 조정하기 전에 현재 버퍼 크기(오프셋)를 지정합니다.
-
pUser_typeObject
-
userm_type 개체에 대한 포인터를 지정합니다 .
-
Buffer
-
현재 버퍼 포인터를 지정합니다.
설명
각 애플리케이션별 데이터 형식인 userm-type 에는 형식의 유선 표현을 정의하는 유선 형식 과 일대일 대응이 있습니다. 마샬링할 데이터의 크기를 조정하고, 데이터를 마샬링 및 마스헤어 해제하고, 메모리를 해제하는 루틴을 제공해야 합니다. 데이터에 [wire_marshal] 또는 [user_marshal]로 정의된 포함된 형식이 있는 경우 포함된 형식의 서비스도 관리해야 합니다. 이러한 루틴에 대한 자세한 내용은 wire_marshal 특성을 참조하세요.
구현은 OSF-DCE 사양에 따라 마샬링 규칙을 따라야 합니다. NDR 전송 구문에 대한 자세한 내용은 에서 https://www.opengroup.org/onlinepubs/9629399/chap14.htm확인할 수 있습니다. 유선 프로토콜에 익숙하지 않은 경우 [wire_marshal] 을 사용하지 않는 것이 좋습니다.
와이어 형식은 인터페이스 포인터 또는 전체 포인터일 수 없습니다. 유선 형식에는 잘 정의된 메모리 크기가 있어야 합니다. 지정된 와이어 형식을 마샬링하는 방법에 대한 자세한 내용은 user_marshal 및 wire_marshal 대한 마샬링 규칙을 참조하세요.
userm-type은 인터페이스 포인터가 아니어야 합니다. 이러한 포인터는 직접 마샬링할 수 있기 때문입니다. 사용자 유형이 전체 포인터인 경우 별칭을 직접 관리해야 합니다.
NDR 엔진이 전송된 형식에 대한 메모리 할당을 제어하지 않으므로 [할당] 특성과 함께 [wire_marshal] 특성을 직접 또는 간접적으로 사용할 수 없습니다.
예
typedef unsigned long _FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)]
_FOUR_BYTE_DATA FOUR_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
);
참고 항목