object 特性
[object] 接口属性标识 COM 接口。 (不包括 [object] 属性的接口属性列表指示 DCE RPC interface.)
[
object,
uuid(string-uuid)
[ , interface-attribute-list]
]
interface interface-name : base-interface
{
...
}
-
string-uuid
-
由 Uuidgen 实用工具生成的 UUID 字符串。 可以将 UUID 字符串括在引号中。
-
interface-attribute-list
-
应用于接口的其他属性作为一个整体。
-
interface-name
-
接口的名称。
-
base-interface
-
从中派生此接口的 COM 接口。 基接口必须是 IUnknown、 IDispatch 或其他直接或间接派生自 IUnknown 或 IDispatch 的 COM 接口。
COM 接口的接口属性列表必须包含 [uuid] 属性,但不能包含 [version] 属性。
默认情况下,使用 MIDL 编译器编译 COM 接口会生成生成代理 DLL 所需的文件。 此 DLL 包含用于支持客户端应用程序和对象服务器使用自定义 COM 接口的代码。 但是,如果 COM 接口的接口属性列表指定 [local] 属性,则 MIDL 编译器仅生成接口头文件。
MIDL 编译器自动生成 COM 接口的接口数据类型。 作为替代方法,可以将 typedef 与接口关键字 (keyword) 一起使用,以显式定义接口数据类型。 然后,接口规范可以在函数参数和返回值、结构和联合成员以及其他类型声明中使用接口数据类型。 以下示例演示如何使用自动生成的 IStream 数据类型:
[
object,
uuid (ABCDEFOO-1234-1234-5678-ABCDEF123456)
]
interface IStream : IUnknown
{
typedef IStream * LPSTREAM;
// Other interface definition statements.
}
在 COM 接口中,所有接口成员函数都假定为虚拟函数。 虚拟函数将隐式 此 指针作为第一个参数。 虚拟函数表包含每个接口成员函数的条目。
非[local] 对象接口成员函数的返回值必须为 HRESULT 或 SCODE。 (请注意,早期版本的 MIDL 允许成员函数返回 void。但是,从 MIDL 版本 3.0 开始,返回 void 会生成编译器错误。) 返回值为 HRESULT 或 SCODE 意味着如果在远程调用期间生成异常,则生成的代理会捕获异常并在返回值中返回异常代码。 如果应用程序能够忽略远程过程调用期间发生的错误,则可以将 HRESULT 指定为返回类型,而无需在调用后检查返回值。
如果要重新编译旧应用程序,则当服务器将新引入的结果发送到客户端时,更改返回类型可能会导致向后兼容性问题。 作为更改返回类型的替代方法,可以使用 [call_as] 属性标记返回 void 的函数,从而使其成为本地函数。 然后,定义具有相同参数但返回类型为 HRESULT 的相关远程函数。 如有必要,本地函数可以根据该 HRESULT 值引发异常。
使用 MIDL 编译器 /osf 开关进行编译时,[object] 属性不可用。
[
uuid(12345678-1234-1234-1234-123456789ABC),
object
]
interface IMyInterface : IUnknown
{
// Interface definition statements.
}
[
uuid(87654321-1234-1234-1234-123456789ABC),
object,
local
]
interface ILocalInterface : ISomeOldCOMInterface
{
// Interface definition statements.
}