• ベストアンサー

VB6→VS2005アップグレード後のエラーについて

VBを勉強中です。 段階としては書籍やサイトの見本プログラムを いくつか真似て作っているところです。 VB6で作られたプログラムのバージョンアップを 行う作業で、VB6→VS2005アップグレード完了後、 ビルドは完了するものの以下の警告が発生します。 変数 'int_d_sh' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。 「int_d_shが宣言された後、If int_d_sh = "PSUP" Thenまでの間で If int_d_shに値が入っていないのが原因なのでしょうか?」 「又、それが原因かどうかはわからないのですが デバッグ中に下記の例外エラーメッセージが発生し デバッグが完了しませんでした。」 [InvalidOperationExceptionはハンドルされませんでした。] フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。エラー: System.Security.Permissions.SecurityPermission 「詳細を表示したのですが、どこを参照すれば良いのか わかりませんでした。 どうすれば解決するのでしょうか? 以下は例外エラーが示したコード部分です。 よろしくお願いします。」 <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>Partial Class frm○○(プロジェクト名) #Region "Windows フォーム デザイナによって生成されたコード " <System.Diagnostics.DebuggerNonUserCode()> Public Sub New() MyBase.New() 'この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

「変数 'int_d_sh' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。」 VBしか使ったことが無ければ判らないかもしれませんが、C/C++ではおなじみの警告文です。 VB6までは変数を宣言すると自動的に初期化される仕様でした。(この仕様のために宣言時に初期値の設定ができなかった) だから変数に値を代入せずにいきなり使用してもエラーにはなりませんでした。 しかし、VB.NETになってからは変数の宣言時に初期化しなくなりました。(その代わりに初期値を設定できる) そのために、変数を宣言しただけでは変数にはゴミが入っています。 ゴミの状態によっては、その変数のデータ型では許可されないようなデータ(ビットパターン)になる可能性があります。 そんな状態でその変数を参照するとエラー(Null参照は一例)になったりします。(しかもエラーの原因が判らないことがある) そういうエラー発生を防ぐために上記の警告文がでてきます。 対策としては、宣言時に初期値を入れたり、参照前に値の代入を行います。

npupu
質問者

お礼

C/C++ではよくある警告なのですね。 変数 'int_d_sh' についてはお蔭様で解決しました。 ありがとうございました。

その他の回答 (3)

回答No.4

>「int_d_shが宣言された後、If int_d_sh = "PSUP" Thenまでの間で >If int_d_shに値が入っていないのが原因なのでしょうか?」 そうです。 ソースコード上で見えないだけで、実際には使用される前に確実に値が入るのが 分かっている場合は、警告が出ても致命的な問題ではないです。 ですが、そのまま警告を残しておくのも あまり良くないので、既に出てきていますが 変数を特定の値で初期化してしまいましょう。 Dim xxx As xxx = xxxxx みたいな書き方です。この書き方は、VB6ではConst(定数)の定義でしか 出来ませんでしたが、VB.NETでは変数の初期化にも使えます。Object参照も 変数定義の時点で出来ます。 .NETでは、なるべく変数は初期化するクセをつけた方がいいかもしれませんね。 >[InvalidOperationExceptionはハンドルされませんでした。] こちらについては、はっきりとは分からないのですが、 Designer.vb内の情報でエラーになっていますので、恐らく.NETへのコンバートが うまく出来ないコントロールを使っているとか、VB6にも.NETにも存在するコントロールだけど コントロールのプロパティとかメソッドとかに違いがあって、うまくコンバートできなかった のかなぁ、という気がします。 可能であれば、VB6で怪しいと思う(?)コントロールを削除してみてから、 2005にアップグレードしてみれば、エラーが無くなるかもしれません。 (InitializeComponentの中のような気がするけど、中のどこで止まったかが分かれば  判断しやすいんですけどね…)

npupu
質問者

お礼

変数 'int_d_sh' についてはエラー解消されました。 ありがとうございます。 >[InvalidOperationExceptionはハンドルされませんでした。] こちらについては勉強不足なのですね。。。 みなさんのアドバイスがよく理解できません。 VB6のソフトは手元にないので、コントロールの削除? (コンポーネントトレイに貼りつくアレのことでしょうか)ができません。。。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

「変数 'int_d_sh' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。」 VB.NET 2005 では コンパイラオプションで 変数の割り当ては 明示的に使用する前に宣言しないとエラーになると思います。 IFなどで条件で宣言部分を行っていませんか? もしくは勘違い ローカルとPUBLIC変数の混同など・・・ 動的に意図的に使用する場合はこのオプションをはずせばよかったとおもいます。 それと、画面のデザインはVB.NET では コードで表示されれます。 オブジェクト定義やプロパティなど・・・ ですからエラー箇所のデザイン部分の定義をコメントアウトしてコンパイルが通るかどうかといった試行錯誤しながら判断してみてはいかがでしょうか? 原因がわかるかもしれません。 VB6でのコンバートは経験がないので参考意見ですがよろしくです。

npupu
質問者

お礼

使用する前に変数 'int_d_sh' を宣言し、エラーは消えました。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

デバッグモードで実行してみたのでしょうか? コンバートの際の警告と今回の例外とは直接関係無いかもしれません Null参照の例外なら NullReferenceExceptionが発生するはずですから

npupu
質問者

お礼

返事が遅れてしまい申し訳ありません。 デバッグモードでの実行です。 直接的に関係ないのでしょうか・・・

関連するQ&A