如何为VARIANT_BOOL指定默认值?

6

MS IDL为参数指定默认值的语法为defaultvalue。 我尝试为接受VARIANT_BOOL的函数指定默认值:

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

并且收到了以下错误信息:

错误 MIDL2035:需要常量表达式

如何正确指定bar的默认值应为VARIANT_TRUE的语法?

2个回答

7

VARIANT_TRUE 在 WTypes.h 中有定义。你不能直接在 .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 吗?我很好奇哪种方法是官方的。 - Motti
1
TRUE的值是错误的。考虑到mshtml.idl是一个核心的微软头文件,我认为-1应该是官方的方式。 - Hans Passant
在C++中,TRUE的值是错误的,但在IDL中似乎它的值是正确的(请参见我的回答)。关于MSHTML.idl,你从哪里找到它的?我有从DLL生成的.tlh和.tli文件,但没有原始的.idl文件。 - Motti
在Windows SDK的包含目录中。不,midl并不能神奇地将1变成-1。它似乎能够工作的唯一原因是大多数代码将检查value != VARIANT_FALSE以检查真值。或者if (value) {}。迟早你会遇到检查VARIANT_TRUE的代码。那时候就糟糕了。 - Hans Passant
找到了IDL。至于值,你可以自己尝试一下,它会作为“-1”而不是“1”传递给C++。 - Motti
还要看客户端运行时。解释器使用后期绑定。 - Hans Passant

1

尽管不能混淆{{link1:boolBOOLVARIANT_BOOL}},但在 idl 中,BOOL 被解释为 VARIANT_BOOL 值。

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

当从未指定参数的VBScript中调用时,此代码将作为-1传递到C++代码。

我不确定哪种方式更符合习惯用法,是TRUE还是如@Hans所建议的-1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接