Поделиться через


Поиск и устранение неполадок в обновленных приложениях Visual Basic 6.0

Обновлен: Ноябрь 2007

Несмотря на то что средства обновления Visual Basic 2008 были тщательно спроектированы с целью обнаружения любых проблем в обновляемых приложениях и вывода соответствующей информации, в некоторых случаях они могут быть не обнаружены. На этой странице приведен список известных проблем, которые не обнаруживаются средствами обновления, и инструкции по их устранению.

После обновления Visual Studio недоступны ссылки на файлы справки

При работе с приложением, обновленным с помощью более ранней версии Visual Studio, ссылки на файлы справки, вставленные средством обновления, могут вызывать ошибку "Страница не найдена". Это происходит из-за того, что ссылки указывают на коллекцию разделов справки для более ранней версии и формат ссылок на коллекцию разделов справки был изменен.

Для устранения этой проблемы можно скопировать строку ошибки и воспользоваться для нахождения нужного раздела функцией поиска в справке. Обратите внимание, что некоторые строки ошибок включают переменные, поэтому может потребоваться осуществлять поиск по части строки.

Отличия в действии строк фиксированной длины в пользовательских типах

В Visual Basic 6.0 строка, назначенная строке фиксированной длины в пользовательском типе, автоматически усекается до заданной фиксированной длины. При обновлении до версии Visual Basic 2008 строки не усекаются, что может приводить к неверным результатам.

7et3d226.alert_note(ru-ru,VS.90).gifПримечание.

При обновлении к строкам фиксированной длины в пользовательских типах добавляется атрибут 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-объекта с поздним связыванием в качестве параметра для вызова позднего связывания объект принудительно преобразовывался в объект Variant типа Nothing. При обновлении до Visual Basic 2008 COM-объекты, объявленные как тип Object, обрабатываются так же, как объекты Variants (которые при обновлении всегда преобразуются в тип Object); эти объекты маршалируются в объект Variant типа 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