アップグレードに関する推奨事項 : Win32 API に対するデータ型の調整
更新 : 2007 年 11 月
多くの API は、Visual Basic 6.0 の場合とまったく同じように使用できますが、データ型を適宜調整する必要があります。Visual Basic 6.0 の長整数型 (Long) は、Visual Basic 2008 では整数型 (Integer) に置き換えられています。また、Visual Basic 6.0 の整数型 (Integer) は、Visual Basic 2008 では短整数型 (Short) に置き換えられています。アップグレード時にはこの変換が自動的に行われ、単純な API ならば Visual Basic 6.0 の場合とまったく同じように動作します。以下に例を示します。
Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("System Version is " & Ver)
End Function
このコードは次のように変更されます。
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 の固定長文字列データ型は Visual Basic 2008 ではサポートされず、固定長文字列ラッパー クラスにアップグレードされます。多くの場合、Visual Basic 6.0 では通常の文字列を使用して同じ動作を実行できます。以下に例を示します。
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
このコードは、固定長文字列の代わりに長さ 25 に明示的に設定された通常の文字列を使用して記述することもできます。
Dim Buffer As String
Buffer = String$(25, " ")
これは、次のように 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
場合によっては、Visual Basic 2008 の方が API に文字列を渡す処理に優れています。これは、ANSI キーワードと UNICODE キーワードを使用して、文字列を渡す方法を宣言することもできるためです。
次の 3 つの場合に、いくつかの変更が必要になります。1 つ目は、固定長文字列またはバイト配列を含むユーザー定義型を API に渡す場合です。Visual Basic 2008 では、ユーザー定義型内の固定長文字列とバイト配列のそれぞれに (System.Runtime.InteropServices 名前空間から) MarshallAs 属性を追加して、コードを変更することが必要な場合もあります。2 つ目は、Declare ステートメントで As Any 変数型を使用している場合です。Visual Basic 2008 では、これはサポートされていません。As Any 型の変数は、文字列または Null の変数を渡すときによく使用されました。この Visual Basic 6.0 の機能は、長整数と文字列の 2 つの形式の API を宣言することで置き換えることができます。たとえば、GetPrivateProfileString API には、As Any 型の lpKeyName というパラメータがあります。
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
Declare を、それぞれ long を取る形式と string を取る形式の 2 つで置き換えることにより、この "As Any" を削除できます。
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
API に NULL 値を渡すには、GetPrivateProfileStringNullKey の方を使用します。これにより、関数を Visual Basic 2008 にアップグレードできます。
変更が必要になる最後のケースは、スレッド作成、Windows クラスの継承、メッセージ キューのフックなどを行う API を使用している場合です。これらの関数には、Visual Basic 2008 でランタイム エラーの原因となるものもあります。これらの API の多くについて、Visual Basic 2008 または .NET Framework に対応する API があります。それぞれ場合に応じて修正してください。