dispinterface 特性

dispinterface 语句定义一组属性和方法,可对其调用 IDispatch::Invoke。 可以通过显式列出语法 1) (受支持的方法和属性集,或通过 (语法 2) 列出单个接口来定义 dispinterface。

[
    [attributes]
]
dispinterface dispinterface-name
{
    properties:
        property-list
    methods:
        method-list
};

[
  [attributes]
]
dispinterface dispinterface-name
{
    interface interface-name
};

参数

attributes

指定应用于整个 dispinterface 的属性。 接受以下属性: [helpstring][helpcontext][helpfile][hidden][nonextensible][oleautomation][restricted][uuid][version]

dispinterface-name

在类型库中已知 dispinterface 的名称。 此名称在类型库中必须唯一。

property-list

(语法 1) 对象支持的属性的可选列表,以变量的形式声明。 这是在方法列表中声明属性函数的简短形式。 有关详细信息,请参阅注释部分。

method-list

(语法 1) 包含 dispinterface 中每个方法和属性的函数原型的列表。 methlist 中可以显示任意数量的函数定义。 methlist 中的函数具有以下形式:

[attributes]returntype methname type paramname (params) ;

dispinterface 中的方法上接受以下属性: [helpstring][helpcontext][propget][propput][propputref][string][vararg]。 如果指定 了 [vararg] ,则最后一个参数必须是 VARIANT 类型的安全数组。

参数列表是逗号分隔的列表,其每个元素具有以下形式:

[attributes]

类型可以是任何声明或内置类型,也可以是指向任意类型的指针。 参数的属性包括:

[in][out][可选][string]

interface-name

(语法 2) 要声明为 IDispatch 接口的接口的名称。

备注

MIDL 编译器接受从左到右) (以下参数排序:

  1. 必需参数 (没有 [defaultvalue] 或 [可选] 属性的参数) ,
  2. 带或不带 [defaultvalue] 属性的可选参数,
  3. 具有 [optional] 属性且不带 [defaultvalue] 属性的参数,
  4. [ lcid] 参数(如果有)
  5. [ retval] 参数

方法函数的指定方式与 模块 的参考页中所述完全一致,但不允许使用 [ entry] 属性。 请注意,STDOLE32。TLB (STDOLE。必须导入 16 位系统上的 TLB) ,因为 dispinterface 继承自 IDispatch。

可以在属性或方法列表中声明属性。 在属性列表中声明属性并不指示属性支持的访问类型, (即 get、put 或 putref) 。 为不支持 put 或 putref 的属性指定 [ readonly] 属性。 如果在方法列表中声明属性函数,则一个属性的函数都具有相同的标识符。

使用第一个语法时,需要 properties: 和 methods: 标记。 每个成员也需要 [ id] 属性。 例如:

properties: 
    [id(0)] int Value;    // Default property. 
methods: 
    [id(1)] HRESULT Show();

与接口成员不同,除 HRESULT 错误代码外,dispinterface 成员不能使用 retval 属性返回值。 [ lcid] 属性对于 dispinterfaces 同样无效,因为 IDispatch::Invoke 传递 LCID。 但是,可以重新声明使用这些属性的接口。

使用第二种语法,支持 IDispatch 和先前在 ODL 脚本中声明的接口可以重新声明为 IDispatch 接口,如下所示:

dispinterface helloPro 
{ 
    interface hello; 
};

前面的示例将 hello 的所有成员和 hello 继承的所有成员声明为支持 IDispatch。 在这种情况下,如果之前使用返回 HRESULT 的 [lcid] 和 [retval] 成员声明了 hello,则 MkTypLib 将删除每个 [lcid] 参数和 HRESULT 返回类型,而是将返回类型标记为 [retval] 参数的返回类型。

注意

Mktyplib.exe工具已过时。 请改用 MIDL 编译器。

 

dispinterface 的属性和方法不是 dispinterface 的 VTBL 的一部分。 因此, CreateStdDispatchDispInvoke 不能用于实现 IDispatch::Invoke。 当应用程序需要通过自动化公开现有的非 VTBL 函数时,将使用 dispinterface。 这些应用程序可以通过检查 dispidMember 参数并直接调用相应的函数来实现 IDispatch::Invoke。

示例

[ 
    uuid(1e196b20-1f3c-1069-996b-00dd010fe676), 
    version(1.0), 
    helpstring("Useful help string."), 
    helpcontext(2480)
] 
dispinterface MyDispatchObject 
{ 
    properties: 
        [id(1)] int x;    //An integer property named x 
        [id(2)] BSTR y;   //A string property named y 
    methods: 
        [id(3)] HRESULT show();    //No arguments, no result 
        [id(11)] int computeit(int inarg, double *outarg); 
}; 
 
[
    uuid(1e123456-1f3c-1069-996b-00dd010fe676)
] 
dispinterface MyObject 
{ 
    properties: 
    methods: 
        [id(1), propget, bindable, defaultbind, displaybind] long x(); 
 
        [id(1), propput, bindable, defaultbind, 
         displaybind] HRESULT x(long rhs); 
}

另请参阅

bindable

defaultbind

displaybind

helpcontext

helpfile

helpstring

隐藏

in

接口

TYPEFLAGS

ODL 文件语法

ODL 文件示例

使用 MIDL 生成类型库

out

nonextensible

propget

propput

propputref

oleautomation

限制

string

uuid

vararg

版本