represent_as 특성
[ represent_as] 특성을 사용하면 특정 전송 가능한 데이터 형식이 애플리케이션에 표시되는 방식을 지정할 수 있습니다. 이 작업은 알려진 전송 가능한 형식에 대해 표시된 형식의 이름을 지정하고 변환 루틴을 제공하여 수행됩니다. 데이터 형식 개체에서 사용하는 메모리를 해제하려면 루틴도 제공해야 합니다.
[represent_as] 특성을 사용하여 클라이언트와 서버 간에 실제로 전송되는 형식이 아닌 다른 변환할 수 있는 데이터 형식을 애플리케이션에 표시합니다. MIDL 컴파일 시 애플리케이션이 조작하는 형식을 알 수 없을 수도 있습니다. 잘 정의된 전송 가능한 형식을 선택하는 경우 다른 유형의 환경에서 데이터 표현에 대해 걱정할 필요가 없습니다. [represent_as] 특성은 네트워크를 통해 전송되는 데이터의 양을 줄여 애플리케이션의 효율성을 높일 수 있습니다.
[represent_as] 특성은 [transmit_as] 특성과 비슷합니다. 그러나 [transmit_as] 에서 전송에 사용할 데이터 형식을 지정할 수 있지만 [represent_as] 를 사용하면 애플리케이션에 대해 데이터 형식을 나타내는 방법을 지정할 수 있습니다. 표시된 형식은 MIDL 처리 파일에서 정의할 필요가 없습니다. 스텁이 C 컴파일러로 컴파일될 때 정의할 수 있습니다. 이렇게 하려면 ACF(애플리케이션 구성 파일) 에서 include 지시문을 사용하여 적절한 헤더 파일을 컴파일합니다. 예를 들어 다음 ACF는 전송 가능한 형식 named_type repr_type 애플리케이션에 로컬 형식을 정의합니다.
typedef [represent_as(repr_type) [, type_attribute_list] named_type;
다음 표에서는 프로그래머가 제공하는 네 가지 루틴에 대해 설명합니다.
루틴에서 반환된 값 | 설명 |
---|---|
named_type_from_local | 네트워크 형식의 instance 할당하고 로컬 형식에서 네트워크 유형으로 변환합니다. |
named_type_to_local | 네트워크 형식에서 로컬 형식으로 변환합니다. |
named_type_free_local | named_type_to_local 루틴을 호출하여 할당된 메모리를 해제 하지만 형식 자체는 해제하지 않습니다. |
named_type_free_inst | 네트워크 유형(양쪽)에 대한 스토리지를 해제합니다. |
이러한 네 가지 프로그래머가 제공하는 루틴 이외에 명명된 형식은 애플리케이션에서 조작하지 않습니다. 애플리케이션에 표시되는 유일한 형식은 표시된 형식입니다. 애플리케이션은 컴파일러에서 생성된 프로토타입 및 스텁에서 전송된 형식 이름 대신 표시된 형식 이름을 사용합니다. 양쪽에 루틴 집합을 제공해야 합니다.
임시 named_type 개체의 경우 스텁은 named_type_free_inst 호출하여 named_type_from_local 호출에 의해 할당된 메모리를 해제합니다.
표시된 형식이 포인터이거나 포인터를 포함하는 경우 named_type_to_local 루틴은 포인터가 가리키는 데이터에 대한 메모리를 할당해야 합니다(표시된 형식 개체 자체는 일반적인 방식으로 스텁에 의해 조작됨). [ out] 및 [in , out] 매개 변수에 대해 [represent_as 또는 해당 구성 요소 중 하나가 포함된 형식의 경우 특성이 포함된 데이터 개체에 대해 named_type_free_local 루틴이 자동으로 호출됩니다. [in] 매개 변수의 경우 [represent_as] 특성이 매개 변수에 적용된 경우에만 named_type_free_local 루틴이 호출됩니다. 특성이 매개 변수 * 의 구성 요소에 적용된 경우 _free_local 루틴이 호출되지 않습니다. [ in] 전용 매개 변수에 대해 포함된 데이터 및 최대 한 번 호출(최상위 특성과 관련된)에 대해 해제 루틴이 호출되지 않습니다.
참고
[transmit_as] 및 [represent_as] 특성을 모두 동일한 형식에 적용할 수 있습니다. 데이터를 마샬링할 때 [represent_as] 형식 변환이 먼저 적용된 다음 [transmit_as] 변환이 적용됩니다. 데이터를 구분 해제할 때 순서가 반전됩니다. 따라서 마샬링할 때 *_from_local 명명된 형식의 instance 할당하고 로컬 형식 개체에서 임시 명명된 형식 개체로 변환합니다. 이 개체는 *_to_xmit 루틴에 사용되는 표시된 형식 개체입니다. *_to_xmit 루틴은 전송된 형식 개체를 할당하고 제공된(명명된) 개체에서 전송된 개체로 변환합니다.
긴 정수 배열을 사용하여 연결된 목록을 나타낼 수 있습니다. 이러한 방식으로 애플리케이션은 목록을 조작하고 전송은 이 형식의 목록이 전송될 때 긴 정수 배열을 사용합니다. 배열로 시작할 수 있지만 긴 정수의 열린 배열과 함께 구문을 사용하는 것이 더 편리합니다. 다음 예제에 이 작업을 수행하는 방법이 나와 있습니다.
/* IDL definitions */
typedef struct_lbox
{
long data;
struct_lbox * pNext;
} LOC_BOX, * PLOC_BOX;
/* The definition of the local type visible to the application,
as shown above, can be omitted in the IDL file. See the include
in the ACF file. */
typedef struct_xmit_lbox
{
short Size;
[size_is(Size)] long DaraArr[];
} LONGARR;
void WireTheList( [in,out] LONGARR * pData );
/* ACF definitions */
/* If the IDL file does not have a definition for PLOC_BOX, you
can still ready it for C compilation with the following include
statement (notice that this is not a C include):
include "local.h";*/
typedef [represent_as(PLOC_BOX)] LONGARR;
LONGARR 형식을 사용하는 루틴의 프로토타입은 실제로 STub.h 파일에 LONGARR 형식 대신 PLOC_BOX 표시됩니다. Stub_c.c 파일의 적절한 스텁도 마찬가지입니다.
다음 네 가지 함수를 제공해야 합니다.
void __RPC_USER
LONGARR_from_local(
PLOC_BOX __RPC_FAR * pList,
LONGARR __RPC_FAR * _RPC_FAR * ppDataArr );
void __RPC_USER
LONGARR_to_local(
LONGARR __RPC_FAR * _RPC_FAR * ppDataArr,
PLOC_BOX __RPC_FAR * pList );
void __RPC_USER
LONGARR_free_inst(
LONGARR __RPC_FAR * pDataArr);
void __RPC_USER
LONGARR_free_local(
PLOC_BOX __RPC_FAR * pList );
위에 표시된 루틴은 다음을 수행합니다.
- LONGARR_from_local 루틴은 목록의 노드 수를 계산하고 sizeof(LONGARR) + Count*sizeof(long)를 사용하여 LONGARR 개체를 할당하고, 크기 필드를 Count로 설정하고, 데이터를 DataArr 필드에 복사합니다.
- LONGARR_to_local 루틴은 크기 노드가 있는 목록을 만들고 배열을 적절한 노드로 전송합니다.
- 이 경우 LONGARR_free_inst 루틴은 아무 것도 해제하지 않습니다.
- LONGARR_free_local 루틴은 목록의 모든 노드를 해제합니다.