• ベストアンサー

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

  • npupu
  • お礼率68% (41/60)

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

  • ベストアンサー
回答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

  • VB6→VS2005アップグレード後

    VBを勉強中です。 段階としては書籍やサイトを参考に既存のプログラムを編集しています。 VB6で作られたプログラムのバージョンアップを行う作業で、VB6→VS2005アップグレード完了後、エラー潰し作業(ここでの意見を参考に)後 デバッグを行う際に、下記の例外エラーが発生しました。 "NullReferenceExceptionはハンドルされませんでした。" mycombo,mylabelが足を引っ張ってるようなのですが ヒントに従い、宣言の部分で "New"を付したり、値に"nothing"を付しても 解決には至りませんでした。 アドバイスをお願いします。 宣言の部分は下記です。 Friend Class frmFinder_S1 Inherits System.Windows.Forms.Form Dim mycombo As System.Windows.Forms.ComboBox Dim mylabel As System.Windows.Forms.Label コードは下記の通りです。 Private Sub Option2_CheckedChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Option2.CheckedChanged If eventSender.Checked Then '座標変換(OFF) d_zahyou = 2 '1-座標変換ON/OFFを取得 d_Z_X = 0 d_Z_Y = 0 d_Z_Z = 0 For i = 3 To 5 mycombo = CType(Me.Controls("combo" & i), Object) 'コンボボックスの表示の切替 If mycombo.Enabled = True Then mycombo.Enabled = False End If Next i For j = 5 To 7 mylabel = CType(Me.Controls("label" & j), Object) 'ラベルの表示の切替 If mylabel.Enabled = True Then mylabel.Enabled = False End If Next j For n = 9 To 11 mylabel = CType(Me.Controls("label" & n), Object) 'ラベルの表示の切替 If mylabel.Enabled = True Then mylabel.Enabled = False End If Next n End If End Sub

  • VB6.0で作成したプロジェクトのVB.NETへのアップグレードでエラー発生

    卒業研究でVBを使う予定です。 先輩の研究を引き継ぐことになっているのですが、VB.NETでプロジェクトを開くことができなくて困っています。 先輩が開発したのはVB6.0で、今研究室のパソコンに入っているのはVB.NETです。 VB.NETのアップグレードウィザードを使えばVB6.0のプロジェクトをVB.NETで編集できることまで調べたのですが、いざアップグレードしようとしたときに以下のようなエラーが出てしまいます。 ・エラー文--------------------------------------- アップグレードに失敗しました:例外が発生しました:参照されたコンポーネント Slider Slider Slider Slider Slider Slider に、デザイン時のライセンスがありません。 -------------------------------------------------- アップグレードできるようにするにはどうすればいいでしょうか? よろしくおねがいします。

  • VB6→VS2005アップグレード後

    いつもお世話になっております。 VBを勉強中です。 VB6→2005にアップグレード後、下記のエラーが発生しました。 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" 以前もこちらでアドバイスをいただき、 デザインの中でADDされているかどうかを確認し、解決に結びついたので 今回も同様かと思い、色々と行ったのですが解決しません。 frmapli_S3のデザイナ内に下記が存在しましたが 原因はここでしょうか? CType(Me.Frame1, System.ComponentModel.ISupportInitialize).EndInit() 以下はVB6での正常稼動時のソースです。 Public Sub ShowPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) Textbox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) PermValue(k) = Textbox.Text Next Next 下記はVB2005アップグレード時のソースです。 Public Sub ShowPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) TextBox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) PermValue(k) = Textbox.Text   ←ここでエラー Next Next End Sub

  • VB6から.NETへアップグレード時について

    VB6+WindowsNT4.0からVB.NET(2005)+WindowsXPにアップグレードをしようとしていますが、 アップグレード中に以下のようなエラーが発生し中断されます。 アップグレードに失敗しました。 例外が発生しました。参照されたコンポーネントを読み込みませんでした。 プロジェクトをアップグレードする前に、このコンポーネントをインストールする必要があります。 COMCT232.ocx(1.1.0) COMCT232.ocxがインストールされているかどうしたら調べることができますか? PCに全く詳しくないのでご教授お願いします。

  • VB6→VS2005アップグレード後 iniを正常に読まない

    VBを勉強中です。 段階としては書籍やサイトを参考に既存のプログラムを編集しています。 VB6で作られたプログラムのバージョンアップを行う作業で、VB6→VS2005アップグレード完了後、エラー潰し作業(ここでの意見を参考に)後 デバッグを行っています。 .exeと同フォルダに.iniファイルを置き、参照ファイルの所在を記し スタートアップオブジェクトの apli load イベントにて起動時に iniを読み込ませたいのですが、うまくいきません。 VB2005では.iniではなく、.xmlでの記述を推奨とのことですが それが原因なのでしょうか。 ビルドを行うと、.xmlが作成され、iniは作成されませんでした。 ヒントでも構いません、どうぞよろしくお願いします。 スタートアップオブジェクトは以下です。 Private Sub frmapli_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load IniFName = My.Application.Info.DirectoryPath & "\apli.ini" End Sub ↓------ここからはapli.ini内容------↓ [apli] MASTER_EXCEL_FILE_J = appli_form_J.xls MASTER_EXCEL_FILE_E = appli_form_E.xls MASTER_EXCEL_FILE_DIR = VERSION_TEXT1 = apli Ver2.1 VERSION_TEXT2 = VERSION_TEXT3 = VERSION_TEXT4 = VERSION_TEXT5 = VERSION_PICTURE = HELPFILE = ↑--------------------↑ 参照ファイルは同フォルダ内にある以下4つのファイルです。 ・apli_form_E.xls ・apli_form_J.xls ・apli.ico ・help.pdf .iniファイルの下記部分をどう記せば良いのでしょうか。 ●MASTER_EXCEL_FILE_DIR = ●VERSION_PICTURE = ●HELPFILE = 又、アップグレード前のVB6作成時での構文は以下でした。 Private Sub Form_Load() IniFName = App.Path & "\apli.ini" End Sub

  • VB6.0からVB.Netへの移行時に

    現在、VB6.0からVB.netへの移行作業をしています。 VB.netでは、Sub_Mainに書かれた処理が終了すると、 アプリケーションも終了するという事がヘルプに書かれて いました。変更手順もありましたので、その通りに 表示したいフォームをスタートアップオブジェクトに指定し、フォームのLoadイベントからSub_Mainを呼び出すように変更しました。 が、エラーがでます。 「System.InvalidOperationException' のハンドルされていない例外が system.windows.forms.dll で発生しました。」 「追加情報 : 1 つのスレッド上で、2 つ目のメッセージ ループを開始できません。Application.RunDialog または Form.ShowDialog を代わりに使用してください。」 .netに触るのは初めてで、入門書と格闘してますが、 エラーの意味する事すらわかりません。 何が問題なのでしょうか? 新規にフォームを作成したものは、問題なく表示されたのですが、VB6.0から移行したものは表示すらできない情況です。

  • VB2008→VB2010でエラーが出てまいります

    VB2008→VB2010でエラーが出てまいります  今日は、質問させていただきます。どうぞよろしくお願いいたします。  VB2008+Vistaから、VB2010に変更しようといたしました。 一度必要のないと思われるものをすべてアンインストールし、 VB2010をインストール後、作成中のプロジェクトを開きましたところ、 以下のようなエラーが出てまいります。 ↓【エラー一覧】の項目でございます 警告 1 タイプ ライブラリ "Microsoft.Office.Core" のラッパー アセンブリが見つかりません。 警告 2参照コンポーネント '(プロジェクト名)' が見つかりませんでした。 警告 3参照コンポーネント 'Microsoft.Office.Core' が見つかりませんでした。 ↓【参照】タブを開こうといたしますと、下のような表示が出てまいります。 ページを読み込もうとしているときにエラーが発生しました。 ターゲット フレームワーク '.NETFramework,Version=v4.0' の mscorlib を解決できませんでした。これは、ターゲット フレームワークがインストールされていない場合、またはフレームワーク モニカーの形式が正しくない場合に発生する可能性があります。  .NET Frameworkの何かを消してしまったのでは?などと考えまして、 再インストールなど奮闘してみましたが、解決いたしません。。。 インストール済みの.NET~は添付図の項目になります。  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただけないでしょうか。 どうぞよろしくお願いいたします。

  • VB2008: 独自例外とは?

    独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass   Sub Main()     On Error GoTo Error_Main     Dim T1 As New TEST1     Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main:     Exit Sub Error_Main:     ErrorMsg(Err.Description & "(Main)")     Resume Exit_Main   End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _MemberCount As Integer   Private _Member1 As String   Private _Member2 As String    ReadOnly Property MembersLengthAverage() As Integer     Get       If _MemberCount <> 0 Then         Return (_Member1.Length + _Member2.Length) \ _MemberCount       Else         Throw New System.Exception("TEST1: 除算エラーが発生しました。" )       End If     End Get   End Property   Public Sub New()     _Member1 = ""     _Member2 = ""   End Sub End Class

  • VBでのカードゲーム作成 (エラーについて)

    2回目の質問です。前回も”VBでのカードゲーム作成”について質問させていただきました。 乱数発生については回答を頂きながらも自力で突破しました。申し訳ありませんでした。 回答者様には感謝しています。 さて、本題ですが2点質問させていただきます。 Menu.vb をトップページとし、そこからボタンによる遷移でAloneGame.vb(一人プレイなので)という画面に移ります。 デバッグした際、トップページよりaloneに飛ぼうとしたところ、以下のエラーが発生しストップしました。 ---------------------------------------------------------------------------------- 'System.InvalidOperationException' のハンドルされていない例外が poker.exe で発生しました。 追加情報: フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。エラー: オブジェクト参照がオブジェクト インスタンスに設定されていません。 ---------------------------------------------------------------------------------- (自力でポーカーを作っています。) 自分でも検索したり調べてはいますが、現在行き詰まっております。 今回は上記の質問がメインですが、前回に引き続きアニメーションについても質問させていただきたいと思います。 前回も少し書きましたが、 □□□□□   相手手札。伏せてあり、裏の模様のみ。 □□        片方が山札、片方が捨て札です。 □□□□□   自分の手札。 暫定的ではありますがこのような形です。 ソリティアなどのように、山札から手札が配られるというアニメーションを付け加えたいのですが、どうしたらいいのでしょうか? 尚、コードすべてを書いていただかなくても、参考書籍、参考ホームページを教えて頂く形でももちろん結構です。 私自身も随時調査中ではあります。 わかりにくいとは思いますがどうぞよろしくお願いします。 この質問を答えるにあたって欲しい情報がありましたら何なりと。

  • なぜエラーになるのでしょうか? アクセス フォーム

    全てのフォームを一気に削除したく、ググってみたら http://okwave.jp/qa/q8093271.htmlが見つかって Sub test() Dim i As Integer For i = CurrentProject.AllForms.Count - 1 To 0 Step -1 DoCmd.DeleteObject acForm, CurrentProject.AllForms(i).Name Next i End Sub のコードを実行してみたのですが、途中で 実行時エラー2467 指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。 という、エラーになってしまいます。 ググってみたらこのエラーはフォームが存在しない時に発生するエラーのようですが、 全てのフォームをループしているのに存在しないフォームを参照する事なんてあるのでしょうか? フォームはすべて閉じている状態で実行しました。 あと、発見したのが、 実行時エラー2467の前に、 実行時エラー29068 この再差を完了することができません。コードを中断し、再度実行してください。 と言うエラーが出るようです。そのままデバッグボタンを押すと、実行時エラー2467になるようです。

専門家に質問してみよう