9

在我使用的一些 IDL 中,我注意到在方法中标记返回值有两种约定 -[in, out][out, retval].

似乎[in, out]在有多个返回值时使用,例如:

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2
);

似乎[out, retval]只有一个返回值时使用,例如:

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1
);

这是 COM IDL 约定还是我正在使用的代码中的约定?

从这两种符号生成的代码是否存在功能差异,或者它们是否完全可以互换?

4

2 回答 2

27

[in, out]表示调用方法时传递了一个有效值,并且当方法返回成功时,有效值存在(指针指向的位置)。[out]表示在调用方法时指向的值可以是任何值,但在方法返回成功时它将有效。[out]和参数都[in, out]必须是指针 - 它们的值不变且有效,并且有效性要求仅适用于它们指向的变量。

[out, retval]是一种语法糖,表示在创建本机 COM 支持包装器时,此参数应转换为返回值。例如

HRESULT MyMethod( [out] long* OutParam1, [out, retval] long* OutParam2 );

变成

long IWrappedInterface::MyMethod( long* OutParam1 );

如果你不标记它[retval],包装器将包含一个带有原始签名的方法:

HRESULT IWrappedInterface::MyMethod( long* OutParam1, long* OutParam2 );

只有最后一个[out]参数可以标记为[out, retval][in, out]参数不能标记为[retval].

于 2009-10-16T05:02:36.450 回答
0

另一个区别是这将如何显示在 .NET 代码中的 PIA 中。

[out, ret] 将在 .NET 中显示为返回值。

[out] 将在 .NET 中显示该方法的参数。

于 2015-08-07T18:19:34.547 回答