三种指针类型

MIDL 支持三种类型的指针,以适应各种应用程序。 这三个不同的级别称为引用指针、唯一指针和完整指针,分别由属性 [ref][unique][ptr] 指示。 这些属性描述的指针类是互斥的。 指针特性可以应用于类型定义、函数返回类型、函数参数、结构或联合的成员或数组元素中的指针。

嵌入指针是结构或联合的成员的指针。 它们也可以是数组的元素。 在 [in] 方向,假定嵌入 的 [ref] 指针指向有效的存储,并且不得为 null。 这种情况以递归方式适用于它们指向的任何 [ref] 指针。 在 [in] 方向上,嵌入 的 [unique] 和完整指针 (具有 [ptr] 属性的指针) 可以为 null,也可能不为 null。

在函数声明的语法中放置在参数上的任何指针属性仅影响该参数的最右侧指针声明符。 若要影响其他指针声明符,必须使用中间命名类型。

返回指针的函数可以将指针属性作为函数属性。 [unique][ptr] 属性必须应用于函数返回类型。 作为指针的成员声明可以将指针属性指定为字段属性。 指针特性也可以作为 typedef 构造中的类型属性应用。

如果未将指针属性指定为字段或类型属性,则根据未归因指针声明的规则应用指针属性,如下所示。

在 DCE 兼容模式下,指针属性在定义的 IDL 文件中确定。 如果在定义接口中指定了 [pointer_default**]属性,则使用该特性。 如果不存在 [pointer_default] 属性,则所有未归因的指针都是完整指针。

在 Microsoft 扩展模式下,可以通过导入 IDL 文件来确定指针属性,并按以下顺序应用:

  1. 应用于使用站点的显式指针属性。
  2. [ref] 属性,当未归因的指针是顶级指针参数时。
  3. 在定义接口中指定的 [pointer_default] 属性。
  4. 基接口中指定的 [pointer_default] 属性。
  5. [unique] 属性。

[pointer_default] 接口属性指定要应用于类型、参数或返回类型声明中的指针声明符的默认指针属性,而该声明没有应用显式指针属性。 [pointer_default] 接口属性不适用于参数的未归因顶级指针,该指针假定为 [ref]