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


Атрибуты массива и Sized-Pointer

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

attribute Использование
size_is Указывает объем памяти, выделяемый для указателей размера, указателей размера для указателей размера и одномерных или многомерных массивов.
max_is Максимальное значение индекса массива.
length_is Количество передаваемых элементов массива.
first_is Индекс первого передаваемого элемента массива.
last_is Возвращает индекс последнего передаваемого элемента массива.
строка Указывает, что одномерный массив char, wchar_t, байтовый (или эквивалентный) массив или указатель на такой массив должны обрабатываться как строка.
Диапазон Задает диапазон допустимых значений для аргументов или полей, значения которых задаются во время выполнения.

 

MIDL поддерживает три типа указателей: ссылочные указатели, уникальные указатели и полные указатели. Эти указатели задаются атрибутами указателя ref, unique и ptr.

Атрибут указателя может применяться как атрибут типа; как атрибут поля, который применяется к элементу структуры, члену объединения или параметру; или как атрибут функции, который применяется к типу возвращаемого значения функции. Атрибут указателя также может отображаться с ключевое слово pointer_default.

Чтобы разрешить параметру указателя изменять значение во время удаленной функции, необходимо предоставить другой уровень косвенного обращения, указав несколько деклараторов указателя. Явный атрибут указателя, применяемый к параметру, влияет только на крайний правый декларатор указателя для параметра. Если в объявлении параметра есть несколько деклараторов указателей, остальные деклараторы по умолчанию используют атрибут указателя, заданный атрибутом pointer_default . Чтобы применить различные атрибуты указателя к нескольким деклараторам указателей, необходимо определить промежуточные типы, указывающие явные атрибуты указателя.

Значения Pointer-Attribute по умолчанию

Если атрибут указателя не связан с указателем, который является параметром, он считается указателем ссылки .

Если атрибут указателя не связан с указателем, который является членом структуры или объединения, компилятор MIDL назначает атрибуты указателя, используя следующие правила приоритета (1 — это самый высокий):

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

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

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

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

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

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

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

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

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