Dépannage des applications mises à niveau à partir de Visual Basic 6.0

Mise à jour : novembre 2007

Les outils de mise à niveau de Visual Basic 2008 sont soigneusement conçus pour détecter et répertorier tous les problèmes des applications mises à niveau. Toutefois, certains d'entre eux restent impossibles à détecter. Cette page répertorie certains problèmes connus non détectés par les outils de mise à niveau et explique comment y remédier.

Impossible d'accéder aux liens d'aide après une mise à niveau de Visual Studio

Lorsque vous travaillez avec une application mise à niveau à partir d'une version antérieure de Visual Studio, les liens d'aide insérés par l'outil de mise à niveau peuvent générer l'erreur « Page non trouvée ». Ce problème est dû au fait que les liens font référence à la collection d'aide de la version antérieure et que le format des liens à l'aide a changé.

Pour résoudre ce problème, vous pouvez copier la chaîne d'erreur et utiliser la fonction de recherche de l'aide pour rechercher la rubrique. Notez que certaines chaînes d'erreur contiennent des variables et que vous devrez donc faire une recherche sur une chaîne partielle.

Différence de comportement des chaînes de longueur fixe dans les types définis par l'utilisateur

Dans Visual Basic 6.0, les chaînes assignées à une chaîne de longueur fixe dans un type défini par l'utilisateur sont automatiquement tronquées lorsqu'elles dépassent la longueur fixée. Une fois la mise à niveau vers Visual Basic 2008 effectuée, les chaînes ne seront plus tronquées. Il se peut donc que vous obteniez des résultats incorrects.

Remarque :

Pendant la mise à niveau, l'attribut VBFixedString est ajouté aux chaînes de longueur fixe dans les types définis par l'utilisateur. Cet attribut permet aux fonctions de fichier de la bibliothèque de compatibilité Visual Basic de les traiter comme des chaînes de longueur fixe.

Pour résoudre ce problème, recherchez un code assignant une chaîne à la chaîne de longueur fixe, ajoutez du code pour vérifier la longueur de la chaîne et tronquez-la si nécessaire :

' 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

La fermeture d'un formulaire appelle Dispose

Dans Visual Basic 6.0, il est possible de décharger un formulaire puis de le recharger ultérieurement en appelant la méthode Show. Dans Visual Basic 2008, la méthode Close de fermeture d'un formulaire appelle la méthode Dispose de manière à ce que le formulaire soit soumis automatiquement à l'opération de garbage collection. Cette opération peut provoquer de légères différences de comportement, parfois difficiles à détecter.

  • Dans Visual Basic 2008, si vous appelez la méthode Show pour un formulaire ayant déjà été déchargé, vous obtiendrez une nouvelle instance du formulaire. Tous les paramètres de propriété de la classe de base seront perdus.

  • Dispose n'est pas appelé automatiquement pour les formulaires avec affichage modal. Dans certains cas, il est utile d'appeler Dispose afin de libérer des ressources.

Les appels à liaison tardive à des objets COM peuvent provoquer des erreurs d'incompatibilité de type

Dans Visual Basic 6.0, lorsqu'un objet à liaison tardive COM est passé comme paramètre à un appel à liaison tardive, l'objet est forcé à correspondre à une Variant de type Nothing. Une fois mis à niveau vers Visual Basic 2008, les objets COM déclarés comme étant de type Object sont traités de la même manière que des Variants (qui sont toujours convertis en type Object lors de la mise à niveau) ; ces objets sont marshalés en type de variant Empty. Il en résulte une erreur d'incompatibilité de type dans Visual Basic 2008.

Pour résoudre ce problème, assurez-vous que tous les objets sont à liaison anticipée.

Les valeurs retournées par Err.Number peuvent être différentes

Dans certains cas, les erreurs retournées par Visual Basic 2008 peuvent être différentes de celles retournées par Visual Basic 6.0. Dans le cas du code de gestion des erreurs qui se basait sur les valeurs retournées par Err.Number, cette différence peut modifier le comportement de votre application.

Le code suivant en donne une illustration :

' 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

Avant de procéder à la mise à niveau, Err.Number retourne toujours 9 (indice hors limites) et exécute la première partie de l'instruction If. Après la mise à niveau, Err.Number retourne 91 (variable objet ou bloc With non défini) et exécute la clause Else. En effet, dans Visual Basic 2008, tout tableau doit être initialisé afin de pouvoir être référencé, alors que dans Visual Basic 6.0, les tableaux sont initialisés lors de leur déclaration.

Si, dans votre code, vous faites référence aux valeurs retournées par Err.Number, testez attentivement les résultats et modifiez votre code en conséquence.

Voir aussi

Concepts

Utilisation de Visual Basic 6.0 et de la version actuelle de Visual Basic

Autres ressources

Mise à niveau d'applications créées dans des versions précédentes de Visual Basic