我正在维护一个使用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类型
发布于 2021-04-23 16:53:35
不过是v.vt == 256,所以条件是假的。
256是varString,这是一个定制的Variant类型,特定于Delphi/C++Builder。在VARTYPE varString API中不存在与Win32 VARIANT API等价的VARIANT,因此不能使用包含Win32 VARIANT函数的AnsiString的Variant。您必须让它持有一个BSTR (WideString),它被标识为varOleStr (VT_BSTR)。
设置
v时,是否需要手动检查str.IsEmpty()和设置v.vt = VT_NULL?
将其设置为varNull。但是,如果您希望Variant是一个空类型,则必须显式地设置它(默认情况下,Variant被初始化为varEmpty -是的,空和空之间有区别)。
您可以为此使用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
}是否有一种检查
Variant是否为AnsiString类型的方法?
正如您所注意到的,vt将是varString。
RTL有一个Variants::VarIsStr()函数,它检查varString (AnsiString)和varOleStr (WideString/BSTR),例如:
#include <Variants.hpp>
Variant v;
...
if (VarIsStr(v))
{
AnsiString str = v;
// do something
}https://stackoverflow.com/questions/67232851
复制相似问题