Поиск и устранение неполадок в обновленных приложениях Visual Basic 6.0
Обновлен: Ноябрь 2007
Несмотря на то что средства обновления 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-объекта с поздним связыванием в качестве параметра для вызова позднего связывания объект принудительно преобразовывался в объект 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