【问题标题】:How to check for NULL variant values when vt == VT_NULL does not work?当 vt == VT_NULL 不起作用时如何检查 NULL 变量值?
【发布时间】:2021-04-23 15:33:14
【问题描述】:

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

【问题讨论】:

  • "Manually" 只是手动的,直到你写了一个函数来完成它。
  • “手动”如“替换成千上万行代码中发生这种情况的数千个实例。
  • 如果你可以搜索替换成你可以控制的东西,比如VT_PRESENT(v),这是一个完全符合你需要的宏和/或函数,你可以对实现细节大惊小怪,而无需更改在测试或改进它时有十亿个东西。如果有人已经硬编码了这样的混乱,那么您无法轻松更改它,所以我不确定您在问什么不需要更改代码的“通用方法”。
  • 如果您已将AnsiString 分配给Variant,我看不出Variant 怎么可能是空的。它将托管一个 AnsiString - 长度可能为 0。
  • 这是您正在修复的错误,还是您刚刚添加了AnsiString 案例?听起来您需要对AnsiString 的空虚进行更高级别的检查,如果是,则将Variant 设置为null。

标签: c++ c++builder vcl


【解决方案1】:

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

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

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

改为将其设置为 varNull。但是,是的,如果您希望 Variant 为 Null 类型,则必须明确设置它(Variant 默认初始化为 varEmpty - 是的,Empty 和 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
}

有没有办法检查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
}

【讨论】:

  • 感谢您的详细解答!它没有解决我的问题,但它帮助我理解了 C++ 的 Variant 类型。我会写一个后续问题,但是这个问题已经回答了。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多