Recomendación de actualización: ajustar los tipos de datos para las API Win32
Actualización: noviembre 2007
Muchas API pueden utilizarse exactamente del mismo modo que en Visual Basic 6.0, con la precaución de hacer los ajustes necesarios en los tipos de datos. El tipo de datos Long de Visual Basic 6.0 ahora es el tipo de datos Integer de Visual Basic 2008 y el tipo de datos Integer de Visual Basic 6.0 es el tipo de datos Short de Visual Basic 2008. Estos cambios se realizan automáticamente durante la actualización; las API sencillas funcionan exactamente igual que lo hacían en Visual Basic 6.0. Por ejemplo:
Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("System Version is " & Ver)
End Function
cambia a:
Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
Dim Ver As Integer
Ver = GetVersion()
MsgBox("System Version is " & Ver)
End Function
Aparte de las actualizaciones de tipos de datos numéricos, Visual Basic 6.0 tiene un tipo de datos de cadena de longitud fija que no se admite en Visual Basic 2008 y que se actualiza a una clase contenedora de cadena de longitud fija. En muchos casos, en Visual Basic 6.0 se puede ejecutar la misma acción utilizando una cadena normal. Por ejemplo:
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
puede escribirse mejor con una cadena normal, establecida explícitamente con una longitud 25, en lugar de con una cadena de longitud fija:
Dim Buffer As String
Buffer = String$(25, " ")
Esto se actualiza a Visual Basic 2008 como sigue:
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
En algunos casos, Visual Basic 2008 controla mejor la transferencia de cadenas a las API, ya que existe la opción de declarar cómo se realiza ese paso mediante las palabras clave ANSI y UNICODE.
Hay tres casos en los que puede ser necesario hacer algún cambio. El primero es cuando se pasan a API tipos definidos por el usuario que contienen cadenas de longitud fija o matrices de bytes. En Visual Basic 2008, es posible que necesite modificar el código, agregando el atributo MarshallAs (del espacio de nombres System.Runtime.InteropServices) a cada cadena de longitud fija o matriz de bytes del tipo definido por el usuario. El segundo caso es el uso del tipo variable As Any en una instrucción Declare. Esto no se admite en Visual Basic 2008. Las variables de tipo As Any solían utilizarse para pasar una variable que fuera una cadena o un valor Null. Para reemplazar este uso de Visual Basic 6.0, declare dos formas de la API: una con valores de tipo Long y otra con cadenas. Por ejemplo, la API GetPrivateProfileString tiene un parámetro lpKeyName de 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
Para quitar "As Any", puede reemplazar Declare por dos versiones, una que acepte un valor de tipo Long y otra que acepte una cadena:
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
Cuando desee pasar el valor Null a la API, utilice la versión GetPrivateProfileStringNullKey. Al hacerlo, la función se actualizará a Visual Basic 2008.
El área final en la que quizá tenga que hacer alguna modificación se presenta si se utilizan API que creen subprocesos, se derivan de clases de Windows, se ejecutan enlaces de colas de mensajes, etc. Algunas de estas funciones producirán un error en tiempo de ejecución en Visual Basic 2008. Muchas de estas API tienen equivalentes en Visual Basic 2008 o .NET Framework. Deberá corregirlas caso por caso.