배열 및 Sized-Pointer 특성
MIDL은 데이터에 대한 데이터 및 포인터 배열을 전달하기 위한 풍부한 기능 집합을 제공합니다. 이러한 특성을 사용하여 배열의 특성과 여러 수준의 포인터를 지정할 수 있습니다.
attribute | 사용량 |
---|---|
size_is | 크기가 큰 포인터에 할당할 메모리 양, 크기가 큰 포인터에 대한 포인터, 단일 또는 다차원 배열을 지정합니다. |
max_is | 배열 인덱스 최대값입니다. |
length_is | 전송할 배열 요소의 수입니다. |
first_is | 전송할 첫 번째 배열 요소의 인덱스입니다. |
last_is | 전송할 마지막 배열 요소의 인덱스를 제공합니다. |
문자열 | 1차원 char, wchar_t, 바이트 (또는 이와 동등한) 배열 또는 이러한 배열에 대한 포인터가 문자열로 처리됨을 나타냅니다. |
범위 | 런타임에 값이 설정되는 인수 또는 필드에 허용되는 값의 범위를 지정합니다. |
MIDL은 참조 포인터, 고유 포인터 및 전체 포인터의 세 가지 종류의 포인터를 지원합니다. 이러한 포인터는 포인터 특성 ref, unique 및 ptr에 의해 지정됩니다.
포인터 특성을 형식 특성으로 적용할 수 있습니다. 구조체 멤버, 공용 구조체 멤버 또는 매개 변수에 적용되는 필드 특성으로, 또는 함수 반환 형식에 적용되는 함수 특성입니다. 포인터 특성은 pointer_default 키워드(keyword) 함께 표시할 수도 있습니다.
원격 함수 중에 포인터 매개 변수의 값이 변경되도록 하려면 여러 포인터 선언자를 제공하여 다른 수준의 간접 참조를 제공해야 합니다. 매개 변수에 적용된 명시적 포인터 특성은 매개 변수에 대한 가장 오른쪽 포인터 선언자에만 영향을 줍니다. 매개 변수 선언에 여러 포인터 선언자가 있는 경우 다른 선언자는 기본적으로 pointer_default 특성에 지정된 포인터 특성으로 설정됩니다. 여러 포인터 선언자에 다른 포인터 특성을 적용하려면 명시적 포인터 특성을 지정하는 중간 형식을 정의해야 합니다.
기본 Pointer-Attribute 값
매개 변수인 포인터와 연결된 포인터 특성이 없는 경우 포인터는 ref 포인터로 간주됩니다.
구조체 또는 공용 구조체의 멤버인 포인터와 연결된 포인터 특성이 없는 경우 MIDL 컴파일러는 다음 우선 순위 규칙을 사용하여 포인터 특성을 할당합니다(1은 가장 높음).
- 포인터 형식에 명시적으로 적용된 특성
- 포인터 매개 변수 또는 멤버에 명시적으로 적용된 특성
- 형식을 정의하는 IDL 파일의 pointer_default 특성
- 형식을 가져오는 IDL 파일의 pointer_default 특성
- ptr (osf 모드); unique (Microsoft RPC 기본 모드)
IDL 파일이 기본 모드로 컴파일되면 가져온 파일은 파일 가져오기에서 포인터 특성을 상속할 수 있습니다. 이 기능은 /osf 스위치를 사용하여 컴파일할 때 사용할 수 없습니다. 자세한 내용은 가져오기를 참조 하세요.
함수 반환 형식
함수에서 반환되는 포인터는 고유한 포인터 또는 전체 포인터여야 합니다. MIDL 컴파일러는 함수 결과가 명시적으로 또는 기본적으로 참조 포인터인 경우 오류를 보고합니다. 반환된 포인터는 항상 새 스토리지를 나타냅니다.
포인터 값을 반환하는 함수는 포인터 특성을 함수 특성으로 지정할 수 있습니다. 포인터 특성이 없으면 함수 결과 포인터는 pointer_default 특성으로 제공된 값을 사용합니다.
형식 정의의 포인터 특성
typedef 문의 최상위 수준에서 포인터 특성을 지정하면 지정된 특성이 예상대로 포인터 선언자에 적용됩니다. 포인터 특성을 지정하지 않으면 typedef 문의 최상위 수준에 있는 포인터 선언자는 사용될 때 포인터 특성 형식을 상속합니다.
DCE IDL은 typedef 선언과 매개 변수 특성 목록 모두에서 동일한 포인터 특성을 명시적으로 두 번 적용할 수 없습니다. MIDL 컴파일러의 기본(Microsoft 확장) 모드를 사용하는 경우 이 제약 조건이 완화됩니다.
원격 프로시저 호출에서 MIDL 배열 및 포인터를 사용하는 방법에 대한 자세한 내용은 배열 및 포인터를 참조하세요.