当 vt == VT_NULL 不起作用时如何检查 NULL 变量值?

How to check for NULL variant values when vt == VT_NULL does not work?

我正在维护一个使用 Borland C++ 2007 和 AnsiString 值的旧系统(对此我无能为力,系统正在逐步淘汰),我有这个用例:

// declared in the header as class property
AnsiString str;    // { Data:NULL }

// used in a class method
Variant v = str;

if (v.vt == VT_NULL || v.vt == VT_EMPTY)
{
     // do something
}

然而v.vt == 256,所以条件为假。

设置v时,是否需要勾选str.IsEmpty(),手动设置v.vt = VT_NULL?最好是,我想要一个通用方法,其中 str 未知,并且类型未知;这个要求过分吗?

编辑

有没有办法检查 Variant 是否属于 AnsiString 类型?

However v.vt == 256, so the condition is false.

256 是 varString,它是 Delphi/C++Builder 特有的自定义 Variant 类型。在 Win32 VARIANT API 中没有 VARTYPE 等价于 varString,所以你不能使用 Variant 持有 AnsiString具有 Win32 VARIANT 功能。你必须让它持有 BSTR (WideString) 而不是,它被标识为 varOleStr (VT_BSTR).

When setting v, do I need to check str.IsEmpty() and set v.vt = VT_NULL manually?

改为 varNull。但是,是的,如果您希望 Variant 为 Null 类型,则必须明确地设置它(Variant 默认初始化为 varEmpty - 是的,两者之间存在差异空和 Null)。

您可以为此目的使用 RTL 的 Variants::Null() 函数,例如:

#include <Variants.hpp>

AnsiString str;

...

Variant v;
if (str.IsEmpty())
    v = Null();
else
    v = str;

...

if (VarIsNull(v) || VarIsEmpty(v))
{
    // do something
}

Is there a way to check if a Variant is of type AnsiString?

如您所见,vt 将是 varString

RTL 有一个 Variants::VarIsStr() 函数,它检查 varString (AnsiString) 和 varOleStr (WideString/BSTR ), 例如:

#include <Variants.hpp>

Variant v;

...

if (VarIsStr(v))
{
    AnsiString str = v;
    // do something
}