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

Leo*_*Hat 8 com idl notation

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

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

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2
);
Run Code Online (Sandbox Code Playgroud)

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

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1
);
Run Code Online (Sandbox Code Playgroud)

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

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

sha*_*oth 25

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

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

HRESULT MyMethod( [out] long* OutParam1, [out, retval] long* OutParam2 );
Run Code Online (Sandbox Code Playgroud)

long IWrappedInterface::MyMethod( long* OutParam1 );
Run Code Online (Sandbox Code Playgroud)

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

HRESULT IWrappedInterface::MyMethod( long* OutParam1, long* OutParam2 );
Run Code Online (Sandbox Code Playgroud)

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