Raccomandazioni sull'aggiornamento: adattamento dei tipi di dati per API Win32

Aggiornamento: novembre 2007

Molte API possono essere utilizzate esattamente come in Visual Basic 6.0, purché i tipi di dati vengano adeguatamente adattati. Il tipo di dati Long di Visual Basic 6.0 corrisponde al tipo di dati Integer di Visual Basic 2008 e il tipo di dati Integer di Visual Basic 6.0 corrisponde al tipo di dati Short di Visual Basic 2008. Nel corso dell'aggiornamento, queste modifiche vengono apportate automaticamente e le API semplici funzionano esattamente come in Visual Basic 6.0. Ad esempio:

Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
    Dim Ver As Long
    Ver = GetVersion()
    MsgBox ("System Version is " & Ver)
End Function

viene modificato in:

Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
    Dim Ver As Integer
    Ver = GetVersion()
    MsgBox("System Version is " & Ver)
End Function

Oltre agli aggiornamenti dei tipi di dati numerici, un altro caso riguarda un tipo di dati di stringhe a lunghezza fissa di Visual Basic 6.0, non supportato in Visual Basic 2008, che viene aggiornato a una classe wrapper di stringhe di lunghezza fissa. In molti casi, in Visual Basic 6.0 è possibile eseguire la stessa operazione utilizzando una stringa normale. Ad esempio:

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

può essere meglio descritto utilizzando una stringa normale con lunghezza impostata esplicitamente su 25 piuttosto che una stringa a lunghezza fissa:

Dim Buffer As String
Buffer = String$(25, " ")

Questo codice viene aggiornato nel modo seguente in Visual Basic 2008:

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

In alcuni casi, in Visual Basic 2008 il passaggio delle stringhe alle API è gestito in modo migliore, poiché mediante le parole chiave ANSI e UNICODE è possibile dichiarare facoltativamente il modo in cui passare le stringhe.

Esistono tre casi in cui occorre apportare alcune modifiche. Il primo riguarda il passaggio alle API dei tipi definiti dall'utente contenenti le stringhe a lunghezza fissa o le matrici di byte. In Visual Basic 2008 può essere necessario modificare il codice aggiungendo l'attributo MarshallAs (dallo spazio dei nomi System.Runtime.InteropServices) a ogni stringa a lunghezza fissa o matrice di byte nel tipo definito dall'utente. Il secondo caso riguarda l'utilizzo del tipo di variabile As Any in un'istruzione Declare. Non è supportato in Visual Basic 2008. Le variabili di tipo As Any venivano spesso utilizzate per passare una variabile corrispondente a una stringa o al valore Null. È possibile evitare questa prassi di Visual Basic 6.0 dichiarando due forme dell'API, una con dati Long e una con dati String. Ad esempio, l'interfaccia API GetPrivateProfileString presenta un parametro lpKeyName di tipo 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

È possibile rimuovere "As Any" sostituendo Declare con due versioni, una che accetta dati di tipo Long, l'altra che accetta dati di tipo 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

Per passare il valore Null all'API, utilizzare la versione GetPrivateProfileStringNullKey. In questo modo, la funzione verrà aggiornata a Visual Basic 2008.

L'ultimo caso in cui può essere necessario apportare modifiche riguarda l'utilizzo di API che eseguono la creazione di thread, la derivazione da classi Windows, l'hook delle code di messaggi e così via. Alcune di queste funzioni causano un errore di runtime in Visual Basic 2008. Molte di queste API presentano degli equivalenti in Visual Basic 2008 o .NET Framework. Occorre risolvere questi errori caso per caso.

Vedere anche

Altre risorse

Raccomandazioni relative al linguaggio in funzione dell'aggiornamento