MIDL 배열
배열 선언자는 IDL 파일의 인터페이스 본문에 다음 중 하나로 표시됩니다.
- 일반 선언의 일부
- 구조체 또는 공용 구조체 선언자의 멤버
- 원격 프로시저 호출에 대한 매개 변수
배열의 각 차원의 범위는 별도의 대괄호 쌍 내에 표현됩니다. n으로 계산되는 식은 0의 하한과 n - 1의 상한을 나타냅니다. 대괄호가 비어 있거나 별표(*)가 하나 있는 경우 하한은 0이고 상한은 런타임에 결정됩니다.
배열에는 [lower...]와 같이 배열의 하한과 상한을 나타내는 줄임표로 구분된 두 개의 값이 포함될 수도 있습니다.upper]. Microsoft RPC에는 하한이 0이 필요합니다. MIDL 컴파일러는 0이 아닌 하한을 지정하는 구문을 인식하지 못합니다.
배열은 size_is, max_is, length_is, first_is 및 last_is 필드 특성과 연결하여 배열의 크기 또는 유효한 데이터가 포함된 배열 부분을 지정할 수 있습니다. 이러한 필드 특성은 배열 차원 또는 인덱스를 지정하는 매개 변수, 구조 필드 또는 상수를 식별합니다.
배열은 다음과 같은 방법으로 필드 특성에 지정된 식별자와 연결되어야 합니다. 배열이 매개 변수인 경우 식별자도 동일한 함수의 매개 변수여야 합니다. 배열이 구조 필드인 경우 식별자는 동일한 구조체의 다른 구조 필드여야 합니다.
런타임에 차원의 상한이 결정되면 배열을 "규칙"이라고 합니다. (런타임에 상한만 확인할 수 있습니다.) 상한을 확인하려면 배열 선언에 size_is 또는 max_is 특성이 포함되어야 합니다.
배열은 컴파일 시간에 범위가 결정되지만 전송된 요소의 범위는 런타임에 결정될 때 "다양한"이라고 합니다. 전송된 요소의 범위를 확인하려면 배열 선언에 length_is, first_is 또는 last_is 특성이 포함되어야 합니다.
호환되는 다양한 배열("open"이라고도 함)은 런타임에 상한 및 전송된 요소의 범위가 결정되는 배열입니다. 한 가지 적합하거나 규칙적인 다양한 배열은 C 구조체에 중첩될 수 있으며 구조체의 마지막 요소여야 합니다. 반면, 형식이 다른 다양한 배열은 구조체의 어디에서나 발생할 수 있습니다.
예제
/* IDL file interface body */
#define MAX_INDEX 10
typedef char ATYPE[MAX_INDEX];
typedef short BTYPE[]; // Equivalent to [*];
typedef long CTYPE[*][10]; // [][10]
typedef float DTYPE[0..10]; // Equivalent to [11]
typedef float ETYPE[0..(MAX_INDEX)];
typedef struct
{
unsigned short size;
unsigned short length;
[size_is(size), length_is(length)] char string[*];
} counted_string;
HRESULT MyFunction(
[in, out] short * pSize,
[in, out, string, size_is(*pSize)] char a[0..*]
);
자세한 내용은 배열 및 포인터를 참조 하세요.
다차원 배열
사용자는 배열 형식을 선언한 다음 이러한 형식의 개체 배열을 선언할 수 있습니다. n차원 배열 형식의 m 차원 배열 의미 체계는 m+n차원 배열의 의미 체계와 동일합니다.
예를 들어 RECT_TYPE 형식은 2차원 배열로 정의할 수 있으며 변수 사각형은 RECT_TYPE 배열로 정의할 수 있습니다. 이는 3차원 배열 equivalent_rect 동일합니다.
typedef short int RECT_TYPE[10][20];
RECT_TYPE rect[15];
short int equivalent_rect[15][10][20]; // ~RECT_TYPE rect[15]
Microsoft RPC는 C 지향적입니다. C 언어 규칙에 따라 다차원 배열의 첫 번째 차원만 런타임에 확인할 수 있습니다. 다른 언어를 지원하는 DCE IDL 배열과의 상호 운용은 다음으로 제한됩니다.
- 상수(컴파일 시간 결정) 범위가 있는 다차원 배열입니다.
- 첫 번째 차원을 제외한 모든 상수 범위가 있는 다차원 배열입니다. 첫 번째 차원의 전송된 요소의 상한 및 범위는 런타임에 따라 달라집니다.
- 하한이 0인 모든 1차원 배열입니다.
다차원 배열에서 [string] 특성을 사용하면 특성이 가장 오른쪽 배열에 적용됩니다.
포인터 배열
참조 포인터는 유효한 데이터를 가리킵니다. 클라이언트 애플리케이션은 특히 배열이 [in], [in,out], [length_is] 또는 [last_is] 값과 연결된 경우 참조 포인터의 [in] 또는 [in,out] 배열에 대한 모든 메모리를 할당해야 합니다. 또한 클라이언트 애플리케이션은 호출 전에 모든 배열 요소를 초기화해야 합니다. 클라이언트로 돌아가기 전에 서버 애플리케이션은 전송된 범위의 모든 배열 요소가 유효한 스토리지를 가리키는지 확인해야 합니다.
서버 쪽에서 스텁은 호출 시 [length_is] 또는 [last_is] 값에 관계없이 모든 배열 요소에 대한 스토리지를 할당합니다. 이 기능은 애플리케이션의 성능에 영향을 줄 수 있습니다.
고유 포인터의 배열에는 제한이 없습니다. 클라이언트와 서버 모두에서 스토리지는 null 포인터에 할당됩니다. 포인터가 null이 아닌 경우 데이터는 미리 할당된 스토리지에 배치됩니다.
선택적 포인터 선언자는 배열 선언자 앞에 옵니다.
포함된 참조 포인터가 [out]전용 매개 변수인 경우 서버 관리자 코드는 참조 포인터 배열에 유효한 값을 할당해야 합니다. 예시:
typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );
생성된 스텁은 배열을 할당하고 배열에 포함된 모든 포인터에 null 값을 할당합니다.