Visual Basic 6.0 からアップグレードされたアプリケーションのトラブルシューティング
更新 : 2007 年 11 月
Visual Basic 2008 のアップグレード ツールは、アップグレードされたアプリケーションのあらゆる問題点を検出して報告するよう入念に設計されていますが、問題が正しく検出されないこともあります。ここでは、アップグレード ツールでは検出されない既知の問題とその対処方法の一覧を示します。
Visual Studio をアップグレードした後でヘルプ リンクにアクセスできない
以前のバージョンの Visual Studio でアップグレードしたアプリケーションを使用している場合に、アップグレード ツールによって挿入されたヘルプ リンクをクリックすると、"ページが見つかりません。" エラーが表示されることがあります。このエラーは、リンクが以前のバージョンのヘルプ コレクションを参照していて、ヘルプ リンクの形式が変更されたために発生します。
この問題を解決するには、エラー文字列をコピーし、ヘルプの検索機能を使用して該当するトピックを検索します。エラー文字列の中に変数が含まれていることもあるので、その場合は一部の文字列だけを使用して検索してください。
ユーザー定義型における固定長文字列の動作の相違点
Visual Basic 6.0 では、ユーザー定義型の中の固定長文字列に割り当てられた文字列がその固定長を超える場合、文字列が自動的に切り詰められます。Visual Basic 2008 にアップグレードすると、文字列の切り詰め処理は行われません。このことにより、不正確な結果が生じる場合があります。
メモ : |
---|
アップグレード時に、ユーザー定義型の中の固定長文字列に VBFixedString 属性が追加されます。この属性により、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
フォームを閉じると Dispose メソッドが呼び出される
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 型に変換されます)。これらのオブジェクトはバリアント型の 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 ステートメントの前半が実行されます。アップグレード後は、91 (オブジェクト変数または With ブロック変数が設定されていません。) が返されるため、Else 句が実行されます。これは、Visual Basic 6.0 では配列を宣言時に初期化するのに対し、Visual Basic 2008 では配列を参照する前に初期化するためです。
Err.Number の戻り値に依存するコードでは、結果を慎重にテストし、必要に応じてコードを変更する必要があります。
参照
概念
Visual Basic 6.0 と現在のバージョンの Visual Basic の両方を使用する