Атрибуты массива и Sized-Pointer
MIDL предоставляет широкий набор функций для передачи массивов данных и указателей на данные. Эти атрибуты можно использовать для указания характеристик массивов и нескольких уровней указателей.
Атрибут | Употребление |
---|---|
size_is | Указывает объем памяти, выделяемый для указателей размера, указателей размера на указатели размера и одномерные массивы. |
max_is | Максимальное значение индекса массива. |
length_is | Количество передаваемых элементов массива. |
first_is | Индекс первого элемента массива для передачи. |
last_is | Предоставляет индекс последнего элемента массива для передачи. |
строковые | Указывает, что одномерный массив char, wchar_t, байтов (или эквивалентный) массив, или указатель на такой массив, должен обрабатываться как строка. |
диапазона | Задает диапазон допустимых значений для аргументов или полей, значения которых задаются во время выполнения. |
MIDL поддерживает три типа указателей: ссылочные указатели, уникальные указатели и полные указатели. Эти указатели задаются атрибутами указателя ссылочные, уникальныеи ptr.
Атрибут указателя можно применять как атрибут типа; как атрибут поля, который применяется к элементу структуры, члену объединения или параметру; или как атрибут функции, который применяется к типу возвращаемой функции. Атрибут указателя также может отображаться с ключевым словом pointer_default.
Чтобы разрешить параметр указателя изменять значение во время удаленной функции, необходимо предоставить другой уровень косвенного обращения путем предоставления нескольких деклараторов указателя. Явный атрибут указателя, применяемый к параметру, влияет только на самый правый декларатор указателя для параметра. При наличии нескольких деклараторов указателя в объявлении параметров другие деклараторы по умолчанию используют атрибут указателя, указанный атрибутом pointer_default. Чтобы применить различные атрибуты указателя к нескольким деклараторам указателя, необходимо определить промежуточные типы, указывающие явные атрибуты указателя.
Значения Pointer-Attribute по умолчанию
Если атрибут указателя не связан с указателем, который является параметром, указатель считается указателем указателем.
Если атрибут указателя не связан с указателем, который является членом структуры или объединения, компилятор MIDL назначает атрибуты указателя, используя следующие правила приоритета (1 — самый высокий):
- Атрибуты явно применены к типу указателя
- Атрибуты явно применены к параметру указателя или члену
- Атрибут pointer_default в файле IDL, который определяет тип
- Атрибут pointer_default в файле IDL, импортируемом типом
- ptr (режим osf); уникальные (режим microsoft RPC по умолчанию)
При компиляции IDL-файла в режиме по умолчанию импортированные файлы могут наследовать атрибуты указателя от импорта файлов. Эта функция недоступна при компиляции с помощью параметраosf или. Дополнительные сведения см. в разделе импорта.
Типы возвращаемых функций
Указатель, возвращаемый функцией, должен быть уникальным указателем или полным указателем. Компилятор MIDL сообщает об ошибке, если результат функции является эталонным указателем либо явным образом, либо по умолчанию. Возвращаемый указатель всегда указывает новое хранилище.
Функции, возвращающие значение указателя, могут указывать атрибут указателя в качестве атрибута функции. Если атрибут указателя отсутствует, указатель на результат функции использует значение, предоставленное в качестве атрибута pointer_default.
Атрибуты указателя в определениях типов
При указании атрибута указателя на верхнем уровне оператора typedef указанный атрибут применяется к декларатору указателя, как ожидалось. Если атрибут указателя не указан, деклараторы указателя на верхнем уровне инструкции typedef наследуют тип атрибута указателя при использовании.
DCE IDL не позволяет явно применять один и тот же атрибут указателя дважды, например в объявлении typedef и списке атрибутов параметров. При использовании режима по умолчанию (расширения Майкрософт) компилятора MIDL это ограничение смягчается.
Обсуждение использования массивов и указателей MIDL в удаленных вызовах процедур см. в разделе Массивы и указатели.