Recommandations de mise à niveau : ajuster les types de données pour les API Win32
Mise à jour : novembre 2007
Beaucoup d'API peuvent être utilisées exactement comme vous le faisiez dans Visual Basic 6.0, à cela près que vous devez ajuster vos types de données en conséquence. Le type de données Long de Visual Basic 6.0 est maintenant le type de données Visual Basic 2008Integer, et le type de données de Visual Basic 6.0 Integer est maintenant le type de données Visual Basic 2008Short. Pendant la mise à niveau, ces modifications sont effectuées pour vous, et les API simples fonctionnent exactement comme dans Visual Basic 6.0. Par exemple :
Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("System Version is " & Ver)
End Function
Est changé en :
Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
Dim Ver As Integer
Ver = GetVersion()
MsgBox("System Version is " & Ver)
End Function
En plus des mises à niveau des types de données numériques, Visual Basic 6.0 dispose d'un type de données de chaîne de longueur fixe qui n'est pas pris en charge dans Visual Basic 2008 et qui, après mise à niveau, devient une classe wrapper de chaîne de longueur fixe. Dans la plupart des cas, vous pouvez effectuer la même opération dans Visual Basic 6.0 en utilisant une chaîne normale. Par exemple :
Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Long) As Long
Function GetUser()
Dim Ret As Long
Dim UserName As String
Dim Buffer As String * 25
Ret = GetUserName(Buffer, 25)
UserName = Left$(Buffer, InStr(Buffer, Chr(0)) - 1)
MsgBox (UserName)
End Function
Peut être mieux écrit en utilisant une chaîne normale dont la longueur aura été fixée explicitement à 25 à la place d'une chaîne de longueur fixe :
Dim Buffer As String
Buffer = String$(25, " ")
La mise à niveau vers Visual Basic 2008 se déroule comme suit :
Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Function GetUser()
Dim Ret As Integer
Dim UserName As String
Dim Buffer As String
Buffer = New String(CChar(" "), 25)
Ret = GetUserName(Buffer, 25)
UserName = Left(Buffer, InStr(Buffer, Chr(0)) - 1)
MsgBox(UserName)
End Function
Dans certains cas, Visual Basic 2008 gère mieux le passage des chaînes aux API ; en effet, vous pouvez, si nécessaire, déclarer la façon dont vous voulez que les chaînes soient passées à l'aide des mots clés ANSI et UNICODE.
Il existe trois cas dans lesquels vous devez impérativement effectuer certaines modifications. Le premier est le passage aux API de types définis par l'utilisateur contenant des chaînes de longueur fixe ou des tableaux d'octets. Dans Visual Basic 2008, vous devrez peut-être modifier votre code en ajoutant l'attribut MarshallAs (de l'espace de noms System.Runtime.InteropServices) à chaque chaîne de longueur fixe ou à chaque tableau d'octets du type défini par l'utilisateur. Le deuxième est l'utilisation du type de variable As Any dans une instruction Declare. Elle n'est pas prise en charge dans Visual Basic 2008. Les variables de type As Any servaient souvent à passer une variable qui était soit une chaîne soit Null ; vous pouvez remplacer cet usage propre à Visual Basic 6.0 en déclarant deux formes pour l'API, l'une avec des types Long, l'autre avec des types String. Par exemple, l'API GetPrivateProfileString a un paramètre lpKeyName de type As Any:
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString _
As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Vous pouvez supprimer "As Any" en remplaçant Declare par deux versions, l'une qui accepte un type Long, l'autre un type String :
Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString _
As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Private Declare Function GetPrivateProfileStringNullKey Lib "kernel32" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Integer, ByVal lpDefault As String, ByVal _
lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName _
As String) As Integer
Lorsque vous souhaitez passer la valeur Null à l'API, vous utilisez la version GetPrivateProfileStringNullKey. Ainsi, la fonction peut être mise à niveau vers Visual Basic 2008.
Enfin, vous devrez peut-être effectuer des modifications si vous utilisez des API qui créent des threads, dérivent des classes Windows, raccordent des files d'attente de messages, etc. Certaines de ces fonctions provoqueront une erreur d'exécution dans Visual Basic 2008. Beaucoup de ces API possèdent des équivalents dans Visual Basic 2008 ou .NET Framework. Vous devrez les corriger une par une.