2009-10-16 101 views
8

在我使用的一些IDL中,我注意到在方法中标记返回值有两种约定 - [in, out][out, retval]COM 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个符号生成的代码是否存在功能差异,还是它们是完全可互换的?

回答

23

[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]

+0

感谢您的有用解释。 – LeopardSkinPillBoxHat 2009-10-16 05:26:40

+0

我想补充一点,'[in,out]'可能无法被所有语言正确处理(更具体地说,老派的Visual Basic,对.NET的不确定)。 – 2009-10-16 09:58:16

+0

我想知道[out,retval]是否违背了定义COM接口的最佳实践,因为如果执行失败,无法获取错误代码(HRESULT)? – dave 2014-05-28 14:47:48

0

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

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

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