Empfehlung zur Aktualisierung: Anpassen von Datentypen für Win32-APIs
Aktualisiert: November 2007
Viele APIs können genauso wie in Visual Basic 6.0 verwendet werden, verbunden mit der Warnung, dass die Datentypen entsprechend angepasst werden müssen. Dem Long-Datentyp von Visual Basic 6.0 entspricht in Visual Basic 2008 der Integer-Datentyp, und dem Integer-Datentyp von Visual Basic 6.0 entspricht in Visual Basic 2008 der Short-Datentyp. Während der Aktualisierung werden diese Änderungen für Sie vorgenommen, und einfache APIs funktionieren ebenso wie früher in Visual Basic 6.0. Beispiel:
Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("System Version is " & Ver)
End Function
wird geändert in:
Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
Dim Ver As Integer
Ver = GetVersion()
MsgBox("System Version is " & Ver)
End Function
Visual Basic 6.0 verfügt über einen Datentyp für Zeichenfolgen fester Länge. Dieser wird in Visual Basic 2008 nicht unterstützt und wird zusammen mit den numerischen Datentypen auf eine Wrapperklasse für Zeichenfolgen fester Länge aktualisiert. In vielen Fällen kann in Visual Basic 6.0 dieselbe Operation unter Verwendung einer normalen Zeichenfolge ausgeführt werden. Beispiel:
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
kann vorteilhafter geschrieben werden, indem eine normale Zeichenfolge verwendet wird, die explizit auf die Länge 25 anstatt auf eine Zeichenfolge fester Länge festgelegt ist:
Dim Buffer As String
Buffer = String$(25, " ")
Dies wird wie folgt auf Visual Basic 2008 aktualisiert:
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 einigen Situationen wird das Übergeben von Zeichenfolgen an APIs von Visual Basic 2008 besser gehandhabt, da optional deklariert werden kann, wie die Zeichenfolgen unter Verwendung des ANSI-Schlüsselworts und des UNICODE-Schlüsselworts übergeben werden sollen.
In drei Fällen werden einige Änderungen benötigt. Der erste Fall betrifft das Übergeben benutzerdefinierter Typen, die Zeichenfolgen fester Länge oder Bytearrays enthalten, an APIs. Sie müssen den Code u. U. in Visual Basic 2008 ändern, indem Sie das MarshallAs-Attribut (aus dem System.Runtime.InteropServices-Namespace) jeder Zeichenfolge fester Länge bzw. jedem Bytearray des benutzerdefinierten Typs hinzufügen. Der zweite Fall betrifft den Variablentyp As Any in einer Declare-Anweisung. Dies wird in Visual Basic 2008 nicht unterstützt. Variablen vom Typ As Any wurden häufig verwendet, um eine Variable zu übergeben, die entweder eine Zeichenfolge oder Null enthielt. Diese Visual Basic 6.0-Verwendungsmethode kann durch das Deklarieren zweier Varianten der API ersetzt werden, einer Variante mit Long-Werten und einer Variante mit Zeichenfolgen. Zum Beispiel verfügt die GetPrivateProfileString-API über einen Parameter lpKeyName vom Typ 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
Sie können "As Any" entfernen, indem Sie Declare durch zwei Versionen ersetzen, eine Version, die einen Long-Wert annimmt, und eine andere, die eine Zeichenfolge annimmt:
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
Wenn der Wert NULL an die API übergeben werden soll, wird die GetPrivateProfileStringNullKey-Version verwendet. Dadurch wird die Funktion auf Visual Basic 2008 aktualisiert.
Der letzte Bereich, in dem einige Änderungen notwendig werden können, betrifft den Fall, in dem APIs verwendet werden, die zur Threaderstellung dienen, Klassen von Windows-Klassen ableiten und Hookfunktionen für Meldungswarteschlangen erstellen usw. Einige dieser Funktionen verursachen in Visual Basic 2008 einen Laufzeitfehler. Viele dieser APIs haben in Visual Basic 2008 oder .NET Framework Entsprechungen. Diese Fehler müssen fallweise behoben werden.