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]
类型可以是任何声明或内置类型,也可以是指向任意类型的指针。 参数的属性包括:
-
interface-name
-
(语法 2) 要声明为 IDispatch 接口的接口的名称。
备注
MIDL 编译器接受从左到右) (以下参数排序:
- 必需参数 (没有 [defaultvalue] 或 [可选] 属性的参数) ,
- 带或不带 [defaultvalue] 属性的可选参数,
- 具有 [optional] 属性且不带 [defaultvalue] 属性的参数,
- [ lcid] 参数(如果有)
- [ 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 的一部分。 因此, CreateStdDispatch 和 DispInvoke 不能用于实现 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);
}
另请参阅