Атрибуты массива и 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 — это самый высокий):
- Атрибуты, явно примененные к типу указателя
- Атрибуты, явно примененные к параметру или члену указателя
- Атрибут pointer_default в IDL-файле, определяющий тип
- Атрибут pointer_default в IDL-файле, который импортирует тип
- ptr (режим osf); unique (режим Microsoft RPC по умолчанию)
Если IDL-файл компилируется в режиме по умолчанию, импортированные файлы могут наследовать атрибуты указателя от импортируемых файлов. Эта функция недоступна при компиляции с помощью параметра /osf . Дополнительные сведения см. в разделе Импорт.
Типы возвращаемых функций
Указатель, возвращаемый функцией, должен быть уникальным или полным указателем. Компилятор MIDL сообщает об ошибке, если результат функции является указателем ссылки, явным образом или по умолчанию. Возвращаемый указатель всегда указывает на новое хранилище.
Функции, возвращающие значение указателя, могут указывать атрибут указателя как атрибут функции. Если атрибут указателя отсутствует, указатель результата функции использует значение, указанное в качестве атрибута pointer_default .
Атрибуты указателя в определениях типов
При указании атрибута указателя на верхнем уровне оператора typedef указанный атрибут применяется к декларатору указателя, как и ожидалось. Если атрибут указателя не указан, деклараторы указателей на верхнем уровне оператора typedef наследуют тип атрибута указателя при использовании.
DCE IDL не позволяет явно применять один и тот же атрибут указателя дважды, например в объявлении typedef и списке атрибутов параметра. При использовании режима по умолчанию (расширения Майкрософт) компилятора MIDL это ограничение ослабляется.
Обсуждение использования массивов и указателей MIDL в удаленных вызовах процедур см. в разделе Массивы и указатели.