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

问题描述

我正在维护一个使用 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 类型?

解决方法

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

256 是 varString,它是特定于 Delphi/C++Builder 的自定义 Variant 类型。 Win32 VARTYPE API 中没有与 varString 等效的 VARIANT,因此您不能使用带有 VariantAnsiString 和 Win32 {{ 1}} 函数。您必须使其包含 VARIANT (BSTR),标识为 WideString (varOleStr)。

设置VT_BSTR时,是否需要手动勾选v并设置str.IsEmpty()

改为将其设置为 v.vt = VT_NULL。但是,是的,如果您希望 varNull 为 Null 类型,则必须显式设置它(Variant 默认初始化为 Variant - 是的,两者之间存在差异空和空)。

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

varEmpty

有没有办法检查 #include <Variants.hpp> AnsiString str; ... Variant v; if (str.IsEmpty()) v = Null(); else v = str; ... if (VarIsNull(v) || VarIsEmpty(v)) { // do something } 是否属于 Variant 类型?

如您所见,AnsiString 将是 vt

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

BSTR