Три типа указателя
MIDL поддерживает три типа указателей для размещения широкого спектра приложений. Три различных уровня называются ссылочными, уникальными и полными указателями, а также указываются атрибутами [ссылок], [уникальные]] и [ptr]соответственно. Классы указателей, описанные этими атрибутами, являются взаимоисключающими. Атрибуты указателя можно применять к указателям в определениях типов, возвращаемых функциями типах, параметрами функции, элементами структур или профсоюзов или элементами массива.
Внедренные указатели — это указатели, которые являются членами структур или профсоюзов. Они также могут быть элементами массивов. В [в] направлении, внедренные [ref] указатели считаются указывающими на допустимое хранилище и не должны иметь значение NULL. Эта ситуация рекурсивно применима к любым [ref] указателям, на которые они указывают. В направлении [in] внедренные [уникальные] и полные указатели (указатели с атрибутом [ptr]) могут иметь значение NULL.
Любой атрибут указателя, помещенный в параметр в синтаксисе объявления функции, влияет только на самый правый декларатор указателя для этого параметра. Чтобы повлиять на другие деклараторы указателя, необходимо использовать промежуточные именованные типы.
Функции, возвращающие указатель, могут иметь атрибут указателя в качестве атрибута функции. Атрибуты [unique] и [ptr] должны применяться к типам возвращаемых функций. Объявления членов, которые являются указателями, могут указывать атрибут указателя в качестве атрибута поля. Атрибут указателя также можно применять как атрибут типа в конструкциях typedef.
Если атрибут указателя не указан в качестве атрибута поля или типа, атрибуты указателя применяются в соответствии с правилами объявления указателя, как показано ниже.
В режиме совместимости DCE атрибуты указателя определяются в определяющем файле IDL. Если существует [pointer_default**]**атрибут, указанный в определяемом интерфейсе, используется этот атрибут. Если атрибут отсутствует [pointer_default], все неуправляемые указатели являются полными указателями.
В режиме расширений Майкрософт атрибуты указателя можно определить путем импорта файлов IDL и применения в следующем порядке:
- Явный атрибут указателя, применяемый на сайте использования.
- Атрибут [ref],, если указатель на неуправляемый объект является параметром указателя верхнего уровня.
- Атрибут [pointer_default], указанный в определяемом интерфейсе.
- Атрибут [pointer_default], указанный в базовом интерфейсе.
- Атрибут [unique].
Атрибут интерфейса [pointer_default] указывает атрибуты указателя по умолчанию, применяемые к декларатору указателя в объявлении типа, параметра или возвращаемого типа, если к нему не применяется явный атрибут указателя. Атрибут интерфейса [pointer_default], не применяется к неуправляемому указателю верхнего уровня параметра, который, как предполагается, [ref].