升級建議:調整 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

除了數字資料型別升級外,Visaul Basic 6.0 還有 Visual Basic 2008 不支援的固定長度字串資料型別,這會升級為固定長度字串包裝函式類別 (Wrapper Class)。在許多情況下,您可以在 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 關鍵字,宣告希望傳遞字串的方式。

有三種情形您可能需要進行某些修改。第一種情形是傳遞包含固定長度字串或位元組陣列的使用者定義型別給 API。在 Visual Basic 2008 中您可能需要變更程式碼,將 (來自 System.Runtime.InteropServices 命名空間的) MarshallAs 屬性 (Attribute) 加入至使用者定義型別中的每一個固定長度字串或位元組陣列。第二種情形是在 Declare 陳述式 (Statement) 中使用 As Any 變數型別。Visual Basic 2008 並不支援這種用法。As Any 型別的變數通常用來傳遞值為字串或 Null 的變數。您可以將這種 Visual Basic 6.0 的用法取代為宣告兩種 API,一種是長整數 (Long),另一種是字串。例如,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 取代為兩種版本,一種接受長整數,另一種接受字串,就可以移除 "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

當您希望傳遞 Null 值給 API 時,可以使用 GetPrivateProfileStringNullKey 版本。以這種方式執行,表示將函式升級為 Visual Basic 2008。

最後一種可能需要進行某些修改的情形,在於如果您會使用執行執行緒建立、衍生自 Windows 類別、執行訊息佇列攔截等 API。其中某些函式會在 Visual Basic 2008 中造成執行階段錯誤。許多 API 在 Visual Basic 2008 或 .NET Framework 中都有對等用法。您必須視個別情況修改這些 API。

請參閱

其他資源

語言升級的建議