如何在IDL中声明IN、可选参数以及OUT、RETVAL参数
How to declare IN, OPTIONAL parameter along with OUT, RETVAL parameter in IDL
我有一个现有的接口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++绑定不支持可选和/或默认值特性。
相关文章:
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- 对函数的 out 字符串参数使用 swap 与赋值
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- "in"和"out"在参数方向上是什么意思?
- (WMI)ExecMethod out 参数 - 无论调用的结果如何,ResultingSnapshot 都是 NULL
- 带有结构 C++ 的 out 参数
- 从可变参数模板容器类中调用给定可变参数的 in 和 out 方法
- 我如何在不使用扩展名的情况下给出命令行参数,而不是./a.out 3 4,而是./a 3 4
- 是否有一种方法可以通过C 中的OUT参数接收Python中的返回值
- GLSL 错误:"out"限定符仅对 GLSL 1.10 中的函数参数有效
- 以"const void * key, void * out"为参数的元帅?
- 从带有 out 参数的 c# 调用本机 c++ 代码
- 管理C++传递浮点 *OUT 作为参数
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- 返回某些内容作为 out 参数的正确术语是什么?
- 如何在IDL中声明IN、可选参数以及OUT、RETVAL参数
- C++ strncpy 参数 "optimized out" ;覆盖随机内存
- IN/OUT参数以及如何在c++中使用它们
- 字符串生成器作为out参数
- 使用使用C风格字符串作为OUT参数的WinAPI函数