COM IDL定义中[in,out]和[out,retval]之间的差异

时间:2009-10-16 00:19:41

标签: com idl notation

在我使用的一些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约定还是我正在使用的代码中的约定?

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

2 个答案:

答案 0 :(得分:25)

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

[out, retval]是一个语法糖,表示在创建Native COM Support包装器时,应将此参数转换为返回值。例如

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]

答案 1 :(得分:0)

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

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

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