从 Visual Basic 6.0 升级的应用程序的疑难解答

更新:2007 年 11 月

尽管 Visual Basic 2008 中的升级工具经过精心设计用于检测和报告有关升级应用程序的所有问题,但仍可能检测不到某些情况。本页列出升级工具检测不到的一些已知问题并阐释如何解决这些问题。

升级 Visual Studio 后无法访问帮助链接

当使用通过 Visual Studio 早期版本升级的应用程序时,由升级工具插入的帮助链接可能导致“找不到页面”错误。发生此问题是因为这些链接引用早期版本的“帮助”集合,并且“帮助”链接的格式已改变。

要修复此问题,您可以复制错误字符串并使用搜索功能在“帮助”中查找该主题。请注意,某些错误字符串包含变量,所以,您可能需要根据部分字符串进行搜索。

用户定义的类型中定长串的行为差异

在 Visual Basic 6.0 中,如果分配给用户定义的类型中定长串的字符串比固定长度长,则它们会自动被截断。升级到 Visual Basic 2008 后,字符串不再被截断,可能导致不正确的结果。

说明:

在升级过程中,VBFixedString 属性将添加到用户定义的类型中的定长串。此属性使 Visual Basic 兼容库中的文件函数将这些字符串作为定长串处理。

若要修复此问题,请查找向定长串分配字符串的所有代码,添加代码来检查字符串的长度,如果必要,则将字符串截断:

' Before
MyString = "1234567"
MyStruct.FixedString5 = MyString

' After
MyString = "1234567"
If Len(MyString) > 5 Then
  MyString = Microsoft.VisualBasic.Left(MyString, 5)
End If
MyStruct.FixedString5 = MyString

关闭窗体时调用 Dispose

在 Visual Basic 6.0 中,可以卸载窗体并稍后通过调用 Show 方法重新加载它。在 Visual Basic 2008 中,窗体的 Close 方法调用 Dispose 方法,以便它自动进行垃圾回收。这会导致细微的行为差异,这种差异可能很难检测到。

  • 在 Visual Basic 2008 中,如果对已经卸载的窗体调用 Show 方法,则将获取该窗体的一个新实例;但会丢失来自基类的任何属性设置。

  • 对于进行模式显示的窗体,不会自动调用 Dispose。某些情况下,可能需要调用 Dispose 以便清理资源。

对 COM 对象的后期绑定调用可能导致类型不匹配错误

在 Visual Basic 6.0 中,当后期绑定的 COM 对象作为参数传递给后期绑定调用时,该对象会被强迫为 Nothing 类型的 Variant。在升级到 Visual Basic 2008 时,声明为 Object 类型的 COM 对象将视为与 Variants(在升级过程中,它们总是转换为 Object 类型)相同;这些对象被封送为 Empty 变量类型。这将导致 Visual Basic 2008 中出现类型不匹配错误。

若要修复此问题,请确保所有对象均为早期绑定。

Err.Number 返回的值可能不同

在某些情况下,Visual Basic 2008 返回的错误可能与 Visual Basic 6.0 返回的那些错误不同。对于依赖于 Err.Number 返回的值的错误处理代码,这可能会在应用程序中导致不同的行为。

下面的代码说明此类情况的一个示例:

' Visual Basic 6.0
On Local Error GoTo Result
Dim x() As Boolean
Dim y As Variant

y = x(10)

Result:
If Err.Number = 9 Then
   ' Do something.
Else
   ' Do something else.
End If

升级之前,Err.Number 始终返回 9(“下标超出范围”)并执行 If 语句的第一部分。升级之后,它将返回 91(未设置 Object 变量或 With 块)并执行 Else 子句。这是因为在 Visual Basic 2008 中,数组必须首先初始化,然后才可以引用;而在 Visual Basic 6.0 中,数组在声明时即初始化。

如果在代码中依赖 Err.Number 的返回值,则应仔细测试结果并根据需要修改代码。

请参见

概念

同时使用 Visual Basic 6.0 和当前的 Visual Basic 版本

其他资源

升级用 Visual Basic 早期版本创建的应用程序