问题描述
我正在维护一个使用 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
,因此您不能使用带有 Variant
的 AnsiString
和 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