当 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
}
我正在维护一个使用 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 checkstr.IsEmpty()
and setv.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 typeAnsiString
?
如您所见,vt
将是 varString
。
RTL 有一个 Variants::VarIsStr()
函数,它检查 varString
(AnsiString
) 和 varOleStr
(WideString
/BSTR
), 例如:
#include <Variants.hpp>
Variant v;
...
if (VarIsStr(v))
{
AnsiString str = v;
// do something
}