Поделиться через


Атрибуты массива и 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 — самый высокий):

  1. Атрибуты явно применены к типу указателя
  2. Атрибуты явно применены к параметру указателя или члену
  3. Атрибут pointer_default в файле IDL, который определяет тип
  4. Атрибут pointer_default в файле IDL, импортируемом типом
  5. ptr (режим osf); уникальные (режим microsoft RPC по умолчанию)

При компиляции IDL-файла в режиме по умолчанию импортированные файлы могут наследовать атрибуты указателя от импорта файлов. Эта функция недоступна при компиляции с помощью параметраosf или. Дополнительные сведения см. в разделе импорта.

Типы возвращаемых функций

Указатель, возвращаемый функцией, должен быть уникальным указателем или полным указателем. Компилятор MIDL сообщает об ошибке, если результат функции является эталонным указателем либо явным образом, либо по умолчанию. Возвращаемый указатель всегда указывает новое хранилище.

Функции, возвращающие значение указателя, могут указывать атрибут указателя в качестве атрибута функции. Если атрибут указателя отсутствует, указатель на результат функции использует значение, предоставленное в качестве атрибута pointer_default.

Атрибуты указателя в определениях типов

При указании атрибута указателя на верхнем уровне оператора typedef указанный атрибут применяется к декларатору указателя, как ожидалось. Если атрибут указателя не указан, деклараторы указателя на верхнем уровне инструкции typedef наследуют тип атрибута указателя при использовании.

DCE IDL не позволяет явно применять один и тот же атрибут указателя дважды, например в объявлении typedef и списке атрибутов параметров. При использовании режима по умолчанию (расширения Майкрософт) компилятора MIDL это ограничение смягчается.

Обсуждение использования массивов и указателей MIDL в удаленных вызовах процедур см. в разделе Массивы и указатели.