【问题标题】:How to specify a default value for VARIANT_BOOL?如何为 VARIANT_BOOL 指定默认值?
【发布时间】:2011-11-24 13:57:21
【问题描述】:

MS IDL 有syntax for specifying a defaultvalue 用于参数。 我尝试为接受VARIANT_BOOL 的函数指定默认值:

[id(42)] HRESULT Foo([in, defaultvalue(VARIANT_TRUE)] VARIANT_BOOL bar);

并收到以下错误消息:

错误 MIDL2035:需要常量表达式

指定bar 的默认值应为VARIANT_TRUE 的正确语法是什么?

【问题讨论】:

    标签: com default-value idl


    【解决方案1】:

    VARIANT_TRUE 在 WTypes.h 中是#defined。您不能直接在 .idl 中使用它。常见的方法是直接使用该值,例如在 mshtml.idl 中所做的:

      [id(42)] HRESULT Foo([in, defaultvalue(-1)] VARIANT_BOOL bar);
    

    如果您愿意,也可以在 .idl 中添加一个#define,将其放在靠近顶部的某个位置:

    #define VARIANT_TRUE -1
    #define VARIANT_FALSE 0
    

    【讨论】:

    • 您知道TRUE 也适用于VARIANT_BOOL 吗?我很好奇这是官方的方法。
    • TRUE 的值错误。鉴于 mshtml.idl 是核心 Microsoft 头文件,我假设 -1 是 official 方式。
    • TRUE 在 C++ 中有错误的值,在 IDL 中它似乎有正确的值(见我的回答)。关于 MSHTML.idl,你在哪里找到的,我有从 DLL 生成的 .tlh 和 .tli,但不是原始的 .idl
    • 在 Windows SDK 的包含目录中。不,midl 不会神奇地将 1 更改为 -1。它似乎工作的唯一原因是大多数代码将检查 value != VARIANT_FALSE 以检查 true。或者如果(值){}。迟早你会遇到检查 VARIANT_TRUE 的代码。哎哟。
    • 找到idl。至于值,请自己尝试,它会以-1 而不是1 的形式传递给C++。
    【解决方案2】:

    虽然不应该混淆bool, BOOL and VARIANT_BOOL,但似乎在idl中BOOL被解释为VARIANT_BOOL值。

    [id(42)] HRESULT Foo([in, defaultvalue(TRUE)] VARIANT_BOOL bar);
    

    在没有指定参数的情况下从 VBScript 调用时,这将到达 C++ 代码为-1

    我不确定TRUE 或@Hans 建议的-1 哪种方式更惯用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多