首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当vt == VT_NULL不工作时,如何检查空变量值?

当vt == VT_NULL不工作时,如何检查空变量值?
EN

Stack Overflow用户
提问于 2021-04-23 15:33:14
回答 1查看 321关注 0票数 1

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

代码语言:javascript
复制
// 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类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-23 16:53:35

不过是v.vt == 256,所以条件是假的。

256是varString,这是一个定制的Variant类型,特定于Delphi/C++Builder。在VARTYPE varString API中不存在与Win32 VARIANT API等价的VARIANT,因此不能使用包含Win32 VARIANT函数的AnsiStringVariant。您必须让它持有一个BSTR (WideString),它被标识为varOleStr (VT_BSTR)。

设置v时,是否需要手动检查str.IsEmpty()和设置v.vt = VT_NULL

将其设置为varNull。但是,如果您希望Variant是一个空类型,则必须显式地设置它(默认情况下,Variant被初始化为varEmpty -是的,空和空之间有区别)。

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

代码语言:javascript
复制
#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),例如:

代码语言:javascript
复制
#include <Variants.hpp>

Variant v;

...

if (VarIsStr(v))
{
    AnsiString str = v;
    // do something
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67232851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档