transmit_as 특성
[transmit_as] 특성은 낮은 수준에서 데이터 마샬링에 대해 걱정하지 않고 데이터 마샬링을 제어하는 방법을 제공합니다. 즉, 다른 유형의 환경에서 데이터 크기 또는 바이트 교환에 대해 걱정하지 않아도 됩니다. 네트워크를 통해 전송되는 데이터의 양을 줄이면 [transmit_as] 특성을 사용하면 애플리케이션의 효율성을 높일 수 있습니다.
[transmit_as] 특성을 사용하여 애플리케이션에서 제공하는 데이터 형식을 사용하는 대신 RPC 스텁이 네트워크를 통해 전송할 데이터 형식을 지정합니다. 데이터 형식을 전송에 사용되는 형식으로 변환하는 루틴을 제공합니다. 데이터 형식 및 전송된 형식에 사용되는 메모리를 해제하려면 루틴도 제공해야 합니다. 예를 들어 다음에서는 xmit_type 형식 으로 지정된 모든 애플리케이션 데이터에 대해 전송되는 데이터 형식으로 type_spec 정의합니다.
typedef [transmit_as (xmit_type)] type_spec type;
다음 표에서는 프로그래머가 제공하는 4개의 루틴 이름을 설명합니다. 형식 은 애플리케이션에 알려진 데이터 형식이며 , xmit_type 전송에 사용되는 데이터 형식입니다.
루틴에서 반환된 값 | 설명 |
---|---|
type_to_xmit | 전송된 형식의 개체를 할당하고 애플리케이션 형식에서 네트워크를 통해 전송된 형식(호출자 및 호출된 개체)으로 변환합니다. |
Type_from_xmit | 전송된 형식에서 애플리케이션 형식(호출자 및 호출된 개체)으로 변환합니다. |
Type_free_inst | 애플리케이션 유형(개체만 호출)에서 사용하는 리소스를 해제합니다. |
Type_free_xmit | 형식*_*to_xmit 루틴(호출자 및 호출된 개체)에서 반환된 스토리지를 해제합니다. |
이러한 4개의 프로그래머 제공 함수 외에 전송된 형식은 애플리케이션에 의해 조작되지 않습니다. 전송된 형식은 네트워크를 통해 데이터를 이동하기 위해 정의됩니다. 데이터가 애플리케이션에서 사용하는 형식으로 변환되면 전송된 형식에서 사용하는 메모리가 해제됩니다.
이러한 프로그래머 제공 루틴은 방향 특성에 따라 클라이언트 또는 서버 애플리케이션에서 제공됩니다. 매개 변수가 [in] 에만 있는 경우 클라이언트는 서버로 전송합니다. 클라이언트에는 type_to_xmit 및 type_free_xmit 함수가 필요합니다. 서버에는 type_from_xmit 및 type_free_inst 함수가 필요합니다. [out] 전용 매개 변수의 경우 서버는 클라이언트로 전송합니다. 서버 애플리케이션은 type_to_xmit 및 type_free_xmit 함수를 구현해야 하지만 클라이언트 프로그램은 type_from_xmit 함수를 제공해야 합니다. 임시 xmit_type 개체의 경우 스텁은 type*_*free_xmit 호출하여 type_to_xmit 호출에 의해 할당된 모든 메모리를 해제합니다.
특정 지침은 애플리케이션 유형 instance 적용됩니다. 애플리케이션 형식이 포인터이거나 포인터를 포함하는 경우 type_from_xmit 루틴은 포인터가 가리키는 데이터에 대한 메모리를 할당해야 합니다(애플리케이션 형식 개체 자체는 일반적인 방식으로 스텁에 의해 조작됨).
[out] 특성이 포함된 형식의 transmit_as [out] 및 [in, out] 매개 변수 또는 해당 구성 요소 중 하나에 대해 특성이 있는 데이터 개체에 대해 type_free_inst 루틴이 자동으로 호출됩니다. 매개 변수 에서type_free_inst 루틴은 [transmit_as] 특성이 매개 변수에 적용된 경우에만 호출됩니다. 특성이 매개 변수의 구성 요소에 적용된 경우 type_free_inst 루틴이 호출되지 않습니다. in 전용 매개 변수에 대해 포함된 데이터 및 최상위 호출(최상위 특성과 관련된) 에 대한 해제 호출은 없습니다.
MIDL 2.0을 사용하면 클라이언트와 서버 모두 네 가지 함수를 모두 제공해야 합니다. 예를 들어 연결된 목록을 크기가 큰 배열로 전송할 수 있습니다. type_to_xmit 루틴은 연결된 목록을 안내하고 정렬된 데이터를 배열에 복사합니다. 배열 요소는 목록 구조와 연결된 많은 포인터를 전송할 필요가 없도록 정렬됩니다. type_from_xmit 루틴은 배열을 읽고 해당 요소를 연결된 목록 구조에 넣습니다.
DOUBLE_LINK_LIST(이중 연결 목록)에는 이전 및 다음 목록 요소에 대한 데이터 및 포인터가 포함됩니다.
typedef struct _DOUBLE_LINK_LIST
{
short sNumber;
struct _DOUBLE_LINK_LIST * pNext;
struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;
복잡한 구조를 전달하지 않고 [transmit_as] 특성을 사용하여 네트워크를 통해 배열로 보낼 수 있습니다. 배열의 항목 시퀀스는 목록의 요소 순서를 더 저렴한 비용으로 유지합니다.
typedef struct _DOUBLE_XMIT_TYPE
{
short sSize;
[size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;
IDL 파일에 [transmit_as] 특성이 표시됩니다.
typedef [transmit_as(DOUBLE_XMIT_TYPE)] DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;
다음 예제에서 ModifyListProc 는 DOUBLE_LINK_TYPE 형식의 매개 변수를 [in, out] 매개 변수로 정의합니다.
void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)
네 개의 프로그래머 정의 함수는 함수 이름에 형식의 이름을 사용하고 필요에 따라 제공된 형식과 전송된 형식을 매개 변수 형식으로 사용합니다.
void __RPC_USER DOUBLE_LINK_TYPE_to_xmit (
DOUBLE_LINK_TYPE __RPC_FAR * pList,
DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);
void __RPC_USER DOUBLE_LINK_TYPE_from_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_inst (
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray);