疑難排解從 Visual Basic 6.0 升級的應用程式

更新:2007 年 11 月

雖然精心設計的 Visual Basic 2008 升級工具的目的,是希望能偵測及報告升級應用程式的任何問題,但有些狀況還是無法偵測出來。本頁面列出目前升級工具無法偵測的已知問題,並且說明如何解決這些問題。

升級 Visual Studio 之後無法存取說明連結

使用以舊版 Visual Studio 升級的應用程式時,由升級工具所插入的說明連結可能會造成「找不到網頁」的錯誤。這是因為連結會參考舊版的說明集合,而說明連結的格式已經變更。

若要修正這個問題,請複製錯誤字串,並於說明中使用搜尋功能來尋找相關主題。請注意,有些錯誤字串會包含變數,所以您可能必須搜尋部分字串。

使用者定義型別中固定長度字串的行為差異

Visual Basic 6.0 中指派給使用者定義型別之固定長度字串的字串超出固定長度時,字串會自動被截斷。升級為 Visual Basic 2008 後,字串不會再遭截斷,但可能產生錯誤的結果。

注意事項:

升級時,會將 VBFixedString 屬性加入至使用者定義型別的固定長度字串。這個屬性 (Attribute) 能讓 Visual Basic 相容性程式庫中的檔案函式,視它們為固定長度字串。

若要修正這個問題,請找出任何將字串指派給固定長度字串的程式碼並且加入程式碼,以檢查字串長度,必要時予以截斷:

' Before
MyString = "1234567"
MyStruct.FixedString5 = MyString

' After
MyString = "1234567"
If Len(MyString) > 5 Then
  MyString = Microsoft.VisualBasic.Left(MyString, 5)
End If
MyStruct.FixedString5 = MyString

關閉表單呼叫處置

如果您在 Visual Basic 6.0 中卸載一個表單,稍後還可以呼叫 Show 方法重新載入這個表單。在 Visual Basic 2008 中,表單的 Close 方法會呼叫 Dispose 方法,以便自動回收記憶體。這會產生不易偵測的細微行為差異。

  • 如果您在 Visual Basic 2008 中為已經卸載的表單呼叫 Show 方法,則會產生表單的新執行個體,基底類別的屬性設定會全部消失。

  • 強制顯示的表單,不會自動呼叫 Dispose。有時,您可能會想呼叫 Dispose 清理資源。

晚期繫結呼叫 COM 物件可能產生型別不符的錯誤

在 Visual Basic 6.0 中將晚期繫結 COM 物件當做參數傳給晚期繫結呼叫時,會強制這個物件轉型為 Nothing 型別的 Variant。升級為 Visual Basic 2008 後,則是將宣告為 Object 型別的 COM 物件視為 Variants (升級時一定轉換為 Object 型別),並將這些物件封送處理 (Marshaling) 為 Empty 變數型別。這在 Visual Basic 2008 中會產生型別不符的錯誤。

若要修正這個問題,請確定所有物件都是早期繫結。

Err.Number 的傳回值可能不同

有時 Visual Basic 2008 傳回的錯誤會與 Visual Basic 6.0 傳回的不同。這對仰賴 Err.Number 傳回值的錯誤處理程式碼而言,可能會讓應用程式發生不同的行為。

下列程式碼顯示一個這樣的範例:

' Visual Basic 6.0
On Local Error GoTo Result
Dim x() As Boolean
Dim y As Variant

y = x(10)

Result:
If Err.Number = 9 Then
   ' Do something.
Else
   ' Do something else.
End If

升級前,Err.Number 一定會傳回 9 (陣列索引超出範圍),並執行 If 陳述式 (Statement) 的第一個部分。升級後,它將傳回 91 (未設定物件變數或 With 區塊),並執行 Else 子句。這是因為 Visual Basic 2008 中的陣列必須先經過初始化後才能參考,而 Visual Basic 6.0 中的陣列則是在宣告時初始化。

如果您的程式碼十分依賴 Err.Number 的傳回值,請小心測試結果,並視需要修改程式碼。

請參閱

概念

同時使用 Visual Basic 6.0 和目前的 Visual Basic 版本

其他資源

升級由舊版 Visual Basic 建立的應用程式