问题描述
在我使用的一些 IDL 中,我注意到在方法中标记返回值有两种约定 - [in, out]
和 [out, retval]
.
In some of the IDL I work with I have noticed that there are 2 conventions for marking return values in methods - [in, out]
and [out, retval]
.
看来[in, out]
是在有多个返回值的时候使用的,例如:
It appears that [in, out]
is used when there are multiple return values, for example:
HRESULT MyMethod(
[in] long InputParam,
[in, out] long* OutputParam1,
[in, out] long* OutputParam2
);
看来[out, retval]
是在只有一个返回值的时候使用的,例如:
It appears that [out, retval]
is used when there is only a single return value, for example:
HRESULT MyMethod2(
[in] long InputParam,
[out, retval] long* OutputParam1
);
这是一个 COM IDL 约定还是只是我正在使用的代码中的一个约定?
Is this a COM IDL convention or just a convention in the code I am working with?
这两种符号生成的代码是否存在功能差异,或者它们完全可以互换?
Is there a functional difference in the code that will be generated from the 2 notations, or are they completely interchangeable?
推荐答案
[in, out]
表示调用方法时传入了一个有效值并且存在有效值(其中指针指向)当方法返回成功时.[out]
表示方法调用时指向的值可以是任何值,但方法返回成功时才有效.[out]
和 [in, out]
参数都必须是指针 - 它们的值不变且有效,并且有效性要求仅适用于它们指向的变量.
[in, out]
means that a valid value is passed when the method is called and a valid value is there (where the pointer points) when the method returns success. [out]
means that the value pointed to can be whatever when the method is called but it will be valid when the method returns success. Both [out]
and [in, out]
parameters must be pointers - their values are unchanged and valid and the validity requirements only apply to the variables they point to.
[out, retval]
是一种语法糖,表示在创建本机 COM 支持包装器时,该参数应转换为返回值.例如
[out, retval]
is a syntactic sugar to indicate that when creating a Native COM Support wrapper this very parameter should be converted to a return value. For example
HRESULT MyMethod( [out] long* OutParam1, [out, retval] long* OutParam2 );
变成
long IWrappedInterface::MyMethod( long* OutParam1 );
如果你不标记它 [retval]
包装器将包含一个带有原始签名的方法:
If you don't mark it [retval]
the wrapper will contain a method with the original signature:
HRESULT IWrappedInterface::MyMethod( long* OutParam1, long* OutParam2 );
只有最后一个[out]
参数可以标记为[out, retval]
.[in, out]
参数不能标记为 [retval]
.
Only the last one [out]
parameter can be marked as [out, retval]
. [in, out]
parameters can't be marked as [retval]
.
这篇关于COM IDL 定义中 [in, out] 和 [out, retval] 的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!