COM IDL 定义中 [in, out] 和 [out, retval] 的区别 [英] Differences between [in, out] and [out, retval] in COM IDL definitions

查看:18
本文介绍了COM IDL 定义中 [in, out] 和 [out, retval] 的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我使用的一些 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] 的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆