如何在IDL中声明IN、可选参数以及OUT、RETVAL参数

How to declare IN, OPTIONAL parameter along with OUT, RETVAL parameter in IDL

本文关键字:参数 OUT RETVAL IDL 声明 IN      更新时间:2023-10-16

我有一个现有的接口API,它有一个OUT, RETVAL参数,如下所示

HRESULT Test([out, retval] VARIANT_BOOL *pVal);

我被要求添加一个可选的IN参数,因此我尝试了下面的操作:因为按照规则,RETVAL参数应该是我被迫使用的最后一个参数将可选的IN参数作为第一个参数

HRESULT Test([in, optional, defaultvalue(VARIANT_FALSE)] VARIANT_BOOL optFlag, [out, retval] VARIANT_BOOL *pVal);

当我尝试像下面这样调用这个API时,只有来自c++组件的强制OUT参数编译器错误地说这个调用需要两个参数

VARIANT_BOOL outFlag;
pInterface->Test(&outFlag);

请让我知道我在这里缺少什么来实现这个组合。

MSDN on optional IDL attribute:

[optional]属性只有当参数类型为VARIANT或VARIANTÂ *时才有效。

您正试图将其应用于VARIANT_BOOL

这里也有一个关于带有这些属性的参数顺序的提示:

MIDL编译器接受以下参数排序(从左到右):

  • 必需的参数(没有[defaultvalue]或[optional]属性的参数),
  • 带或不带[defaultvalue]属性的可选参数,
  • 带有[optional]属性和不带有[defaultvalue]属性的参数,
  • [lcid]参数,如果有,
  • <
  • [retval]参数/gh>

IDL编译器在编译这种方法时发出警告:

warning MIDL2401: [defaultvalue]应用于非variant和[optional]。请删除[可选]:[参数'optFlag'的过程'Test'…

然而,属性被编译成类型库并可供导入器使用。例如,c#将方法导入为:

bool Test(bool optFlag = false);

应该符合您的期望。然而,这更像是一个免费的奖励,因为类型库导入器可以自由地解释标记(特别是超出文档限制)。c++ #import不生成带可选参数的方法

由microsoft IDL编译器生成的c++绑定不支持可选和/或默认值特性。