在我使用的一些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种符号生成的代码中是否存在功能差异,或者它们是否完全可互换?
答案 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中显示关于该方法的参数。