VB6中VarType返回的vbError是什么?

Joe*_*e M 3 vb6 error-handling

我一直在网上搜索这个,但一切都在谈论ErrObject类,或者函数vbError返回的常量VarType。我想知道那种类型实际上什么,例如 aninteger是什么4,astring是什么"hello world",等等。

对于一些背景知识,这里是官方 MSDN 页面 about 的链接VarType,其中显示了它返回的所有常量及其代表的内容。什么是Error value

Eur*_*lli 5

如果你熟悉 C/C++ 中的 COM,你应该知道从这个角度来看VarType()是一个简单的函数,它本质上是vtVariant作为参数传入的成员中提取成员的值。vt成员的可能值记录在许多地方,例如这里

如果您检查 COM 系统头文件的内部(例如 WTypes.h 作为 Windows SDK 的一部分分发),您将看到VbError10的值确实映射到 C/C++ 枚举值VT_ERROR

enum VARENUM
    {  VT_EMPTY   = 0,
       ...
       VT_ERROR  = 10,
       ...
    } ;
Run Code Online (Sandbox Code Playgroud)

上面的MSDN链接描述的意义vt,等于VT_ERROR如下:

指定了 SCODE。错误的类型在scode 中指定。通常,对错误值的操作应根据需要引发异常或将错误传播到返回值。

所以,这基本上是它的意思:

AVariant显然支持存储多种类型的值,其中包括存储“错误代码”的隐晦可能性。更准确地说,这些代码正式称为scode's,因为它们可以表示多种类型的“成功”和“失败”。大多数人将这些代码称为HRESULTs。

这些代码与您Err.Number在 VB6 中获得的“错误代码”类型相同。因此,您可以告诉 aVariant将“错误代码”与普通数字区分开来。

实际上,很少有程序或 COM 组件(如果有的话)会在 Variants 中放置错误代码。几乎每个人都只是发出 COM 异常来传达错误(这种机制在 VB6 中通过Err对象公开)。即使是那些在 COM 异常机制之外返回错误代码的组件,也可能会在类型变量(例如Long's)中这样做。

因此,这个可能的返回值存在的原因是为了完整性。在现实生活中你几乎永远不会看到它。

(编辑:删除关于无法创建“错误”变体的部分。@Joe 证明我错了。你可以CVErr()用来创建一个)