• ベストアンサー

vb製EXEが終了しない

XPでVB6.0のアプリを作っているのですが、unloadや×ボタンで終了しなくなってしまいました。 Form_Unloadにブレークを貼って調べようとしたのですが、ブレークで止まるのですが、そこからIDEの操作が全くできなくなります。 タスクバーでIDEを右クリックし、閉じる(C)を選ぶと終了します。 また、EndステートメントをForm_Unloadに書くと終了します。ただし、EndステートメントだとIDEも終了してしまいます。 終了しなくなった原因ってなんなんでしょうか。

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

  • ベストアンサー
  • coai
  • ベストアンサー率50% (152/301)
回答No.1

サブクラス化に失敗してるんじゃないですかね? IDEにまで影響するという事は、真っ先に疑わしい点だというだけの根拠です。 とりあえず、AddressOfで全文検索してみてください。 サブクラス化にしてもフック絡みにしても、AddressOfを使わない形で実装しているなら、IDEごとこけることはないような気がしますから(あくまで経験上そう感じるだけ、深い根拠はない)。 AddressOfを使ってたら、その関連が最も怪しいと思えます。

kyolly
質問者

お礼

ありがとうございます。 ご指摘の通り、サブクラス化でおかしくなってました。

関連するQ&A

  • VB6でEndステートメントに変わる方法

    VB6を使っております。 Endコマンドを使わずに、Unloadイベントで開いているフォームを閉じていく処理にするのが、定跡とされていますが、OnErrorGotoで飛んだ先でResume Nextではなくて、終了させたい場合は、私はENDステートメントを使っておりますが、 Unload meでイベントを発生させても エラー時には終了できません。 Endステートメントに変わる方法で終了させることは可能でしょうか?

  • VB.NET クラス内でプログラムを終了するには?

    VBAでは、エラーでプログラムを終了する時には Endステートメントを記述していましたが、 このVBAをVB.NET(クラスライブラリ、DLL)に 書き換えていますが VB.NETでClass1クラスの中にtest()メソッドを作って この中にEndステートメントを記述すると 「クラスライブラリプロジェクトで  Endステートメントを使用することができません。」 というメッセージが表示されますが エラーでプログラムを終了するには どのように記述すればいいのでしょうか。 Public Class Class1  Public Sub test(ByVal a As String)   If a = "" Then    MsgBox("致命的なエラーです")    End <===エラー発生   End If  End Sub End Class よろしくお願いします。(WindowsXP,VS2010)

  • 複数フォームを1ボタンクリックで終了させる方法

    VB6.0 WindowsXP (症状) 複数フォームを1クリックで終了できずに困っています。 理由は他のフォームに移ったときにボタンの位置やテキストの内容を残しておきたい為にunloadさせずに、 Me.Hideだけでフォームを移動しているためだと思います。 終了のときは、下記のコードを用いて、終了させています。 標準モジュールに Public Sub sAllEnd() Dim myObject As Object For Each myObject In Forms Unload myObject Set myObject = Nothing Next End Sub をおいて、 各フォームには Private Sub Form_Unload(Cancel As Integer) Dim myResult As Integer myResult = MsgBox("終了します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion, "終了確認") If myResult = vbCancel Then Cancel = True End If Call sAllEnd End Sub 終了メッセージのOKボタンを開いたフォームの枚数分だけクリックしないと終了できない状態です。 これを1クリックで終了できるようにするためにはどうしたら良いでしょうか? よろしくお願いします。

  • 終了してもプログラムが実行したまま(VB)

    非常に時間のかかる繰り返し処理を行なうプログラムを作りました。どのくらい、プログラムが進行しているのかわかりやすくするため、 Progress.Show でProgressという名前のフォームを表示し、そこに、プログラムが何%終わったのか表示するようにしました。 プログラムはDo Loop文が使ってあるので、何%終わったのかを表示するためにLoopした回数を取得して、それをフォームに表示することにしましたが、どこかで調べたら機械は、Do Loopのあいだはフォーム上に文字を表示するのに手が回らないからDoEventsを使ってイベントを実行させなさい、といわれました。 そこまではうまくいきました。プログラムを実行すると、プログラムが実行されて何%終わったかもちゃんと表示できるようになりました。 ところが、プログラムの実行中にフォームの右上の×ボタンを押したところ、フォームは画面から消え、プログラムが終了したように見えるのに、VB Editorでは[実行中]となっており、終わってくれません。ずっとDo Loopが実行されたままです。 Private Sub Form_Terminate() のところに Unload Progress と書いても、「Unloadメソッドは使えません」などというエラー・メッセージが出ます。(フォーム上にボタンを置き、そこをクリックするとUnloadするようにしてみましたがやはり同じことを言われました。) 原因は何でしょうか? フォームをUnloadする、ということの意味をちゃんと理解していないのでいけないのだと思うのですが、調べてもよく言っていることがわかりません。 よろしくお願いします。

  • ActiveXコントロールの作成(VB6)

    こんばんは。 今、VB6でActiveXコントロールを作成しようと思っています。 現在、標準EXEにて、プログラムが作ってあります。 動作としては、 1.スタートボタン(CmdStart)で開始 2.処理(外部の測定器によるデータ収集) 3.終了ボタン(CmdEnd)にてプログラム終了 です。 これをもとに、ActiveXコントロールを作成したいです。手元にある文献にしたがってほぼコピー&ペーストで作成しました。また、これの動作を調べるため、標準EXEのフォームを作成し、そのフォームにActiveXコントロールを貼り付けました。 ここで質問です。 Form_LoadはUserControl_Initializeに書き換えました。(これは文献に載っていました) 最後のプログラム終了がうまくいきません。 標準EXEでは Private Sub CmdEnd_Click() Unload Me End Sub と書いてプログラムを終了させていました。 ここを書き換えずにActiveXコントロールを実行させたらエラーが出ました。"Unload Me"を"End"に書き換えてみたら、サポートされていないと出ました。 CmdEndをクリックしてプログラムを終了させるにはどう書けばいいでしょうか? よろしくお願いします。

  • すぐにexeファイルが終了しない。

    VB5(SP3)でアプリケーション(exeファイル)を作成したのですが、 終了させても、数秒間アプリケーションが作動しているようなのです。 (「Ctrl」+「Alt」+「Delete」で「アプリケーションの強制終了」を表示させて確認しています) Win98でこの現象が発生し、Win95だとすぐに終了してくれます。 (どちらとも、同じスペックのPCです) ちなみに、終了させているプログラムの中身は下記のとおりです。 Private Sub 終了_Click()   (処理)   Unload Me   End End Sub すぐに終了させたいのですが、お手上げ状態です。 ご指導のほど、宜しくお願い致します。

  • EXEでのENDステートメント動作

    VB6.0(SP5)を使用しています。OSはXp Proです。 自作アプリのEXEでの動作で困っています。ENDステートメントが正常に機能しません。 MDIフォームで、メインフォームのLoad中、何らかのエラー(DLLの初期化失敗など)が発生した場合に、ENDステートメントでアプリケーションを終了させています。 VBでデバッグさせている状態だと問題無く終了します。 しかし、コンパイル後のEXEで動作させると必ずメインMDIフォームを表示(起動?)します。 この時に起動されるメインMDIフォームは、各種メニュー等は起動不可で、右上×印の終了ボタンのみ機能します。 ToolBarコントロールを使用しているか否かで、症状が変わります。 (1)MDIフォームにToolBarコントロールを組み込んだ状態  上記、MDIフォームが表示される現象が発生します。 (2)MDIフォームにToolBarコントロールを組み込んでいない状態  正常に終了します。 ToolBarコントロールのプロパティを何か変更する必要があるのでしょうか? 自作アプリだけの問題かとも思い、下記のような単純サンプルを作成して確認しましたが、EXEで動作させるとやはり同様の症状が発生します。 ------------------------------------------------- Private Sub MDIForm_Load() End  '何もせずに終了する筈。 End Sub ------------------------------------------------- ENDステートメントの直前で、何か実行する必要があるのかと思い、下記のようにも試してみました。 1)ToolBarを非表示にする。 Toolbar1.Visible = False 又は Set ToolBar1 = Nothing END  '何もせずに終了する筈。 結果:ツールバーが非表示になるだけで、メインMDIフォームは表示されます。 2)メインMDIフォームを無効にする。 MDIForm1.Enabled = False END  '何もせずに終了する筈。 結果:我ながらマヌケですが、メインMDIフォームが表示され、尚かつ×印すらクリック不可でした。 3)メインMDIフォームを非表示にする。 MDIForm1.Visible = False END  '何もせずに終了する筈。 結果:MDIフォームが非表示となり、一見、よさそうですが、タスクマネージャで確認すると、該当アプリのタスクは終了はしていませんでした。 その他、ENDの代わりに、STOPを使用してみました。 この場合は、STOP実行時に「STOPステートメントで中断しました」とのメッセージが表示され、OKボタンで、やはりメインMDIフォームが表示されます。 どなたか、MDIフォーム+ToolBarコントロールを組み込んだ状態で、正常にENDステートメントを動作させる方法を教えてください。(EXEでの動作です。) また、VBでデバッグさせている状態だと問題無く終了するのは何故なのでしょうか?。 よろしくお願いします。

  • Form1.vbに書いた定数をModule1.vbでも使うには?

    Form1.vbには Public Class Form1Form Public Const 横幅 As Long = 1200 と書いています。 そして、 Module1.vbに Sub 共通_横幅() Form1Form.Width = 横幅 End Sub と書くと、 「名前 '横幅' は宣言されていません。」 となります。 Form1.vbの Public Class Form1Formの上に 「Public Const 横幅 As Long = 1200」 を移動しても 「名前空間のステートメントが無効です。」 となります。 どうすれば Form1.vbで宣言した定数をModule1.vbで使用することができるのでしょうか? スコープを「Public」にしただけではだめなのでしょうか? Class Form1Form.Width = 横幅 にしてもだめでした。 よろしくお願い致します。

  • VBでフォームを閉じる方法

    とても初歩的なことでお恥ずかしい限りですが・・・ どうしてもできないので教えてください。 OSがWindowsXP HomeEdition SP2で、 VisualBasic2005 ExpressEditon Ver8.0を使用しているのですが、フォームを消すことができません。 手順として 1、新規プロジェクトでWindowsアプリケーションを選択 2.フォーム1にボタン1を設置 3.ボタン1をダブルクリックし、コードを記載 自動的に記載されるコード Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ※1 End Sub End Class ここで、※1にunload meと記載。 すると、自動的にunload(Me)と変換されてしまい、 unloadの上にポインタを持っていくと、 「名前unloadは宣言されていません」 と出てしまいます。 一体何がいけないのでしょうか・・・?

  • VB.NET2008を使用しています。

    VB.NET2008を使用しています。 ----- HTML ----- <input type="submit" name="Enter" value="ボタン"> ----- END ------ ----- 構成@VB ----- Form1 Button1 <- これをクリックしてWebBrowserのボタンを押したことにする WebBrowser1 ----- END ----- 上のようなボタン(HTMLのもの)を VB.NETのButton1を押すとWebBrowser1に表示されているWEBページのボタンを 押したようにしたいのですがどのようにすれば実現できますか? よろしくお願いします。

専門家に質問してみよう