Partilhar via


Recomendação de atualização: Ajustar tipos de dados para APIs Win32

Várias APIs podem ser usadas exatamente como estavam no Visual Basic 6.0, com o caveat que você terá que ajustar seus tipos de dados de acordo.The Visual Basic 6.0 Long data type is now the Visual Basic 2008 Integer data type, and the Visual Basic 6.0 Integer data type is now the Visual Basic 2008 Short data type.Durante a atualização, essas alterações serão refletidas para você, e APIs simples funcionam exatamente como que elas funcionavam no Visual Basic 6.0.Por exemplo:

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

Alterações em:

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

Além das atualizações nos tipos de dados numéricos, Visual Basic 6.0 tem um tipo de dados String de comprimento fixo que não é suportado em Visual Basic 2008, e que é atualizado a uma classe wrapper de string de comprimento fixo. Em muitos casos no Visual Basic 6.0 você pode executar a mesma ação usando uma sequência de caracteres normal.Por exemplo:

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

Pode ser melhor escrito usando uma sequência de caracteres normal com comprimento explicitamente definido como 25 em vez de uma sequência de comprimento fixo:

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

Isso é atualizado para Visual Basic 2008 sistema autônomo a seguir:

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

Em alguns casos, Visual Basic 2008 melhor alças passar cadeias de caracteres para APIs, já que opcionalmente você pode declarar como deseja que as seqüências sejam passadas usando o ANSI e UNICODE palavras-chave.

Há três casos onde talvez você precise fazer algumas alterações.O primeiro é passando tipos definidos pelo usuário que contêm sequências de comprimento fixo ou matrizes de byte para APIs.In Visual Basic 2008 Talvez seja necessário alterar seu código, adicionando a MarshallAs atributo (da System.Runtime.InteropServices namespace) a cada matriz de byte ou seqüências de caracteres de comprimento fixo no tipo definido pelo usuário. O segundo caso é usando o As Any tipo de variável em um Declare demonstrativo. Isso não é suportado no Visual Basic 2008. Variáveis do tipo As Any freqüentemente foram usadas para passar uma variável que era uma uma seqüência ou Null; Você pode substituir esse uso do Visual Basic 6.0, declarando duas formas de API, um com longs, um com seqüências. Por exemplo, a GetPrivateProfileString API tem um parâmetro lpKeyName do 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

Você pode remover a "As Any", substituindo o Declare com duas versões, uma que aceita um longo e outra que aceita uma seqüência de caracteres:

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

Quando você desejar passar o valor nulo para a API, você usar o GetPrivateProfileStringNullKey versão. Fazendo dessa maneira significa que a função atualiza para Visual Basic 2008.

A útima área onde você pode precisar fazer algumas mudanças é se você estiver usando APIs que executam a criação de thread, derivam de classes Windows, executam enganchamento de fila de mensagens, e assim por diante.Algumas dessas funções causará um erro de time de execução em Visual Basic 2008. Muitas dessas APIs tem equivalentes em Visual Basic 2008 ou o .NET Framework. Você terá que corrigir esses caso a caso.

Consulte também

Outros recursos

Recomendações de Linguagem para Atualização