- ベストアンサー
VBプログラムの終了
VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
正常動作ならば、終了させれば プロセスも閉じられます。 VBのランタイムが 入ってない場合、異常終了で、ちゃんと終了してないと思われます。
その他の回答 (5)
- BlueRay
- ベストアンサー率45% (204/453)
作成した実行ファイル内での処理はどのようなことをしているのでしょうか? 大きな流れで、どのようなことをしているかわかれば適切な回答を得ることが出来るかもしれません。 ちなみに、既に回答されていますがVBランタイムがないとVBで作成された実行ファイルは動作することが出来ません。
お礼
プログラムはマスタ保守でした。 ランタイムを入れる前にプログラムは実行したのですが、 やはりOSが関係しているのでしょうかね? ありがとうございました。
- BlueRay
- ベストアンサー率45% (204/453)
Unloadだけでは、オブジェクトが残ってしまう場合があるので フォームのQueryUnloadで自分自身(フォームオブジェクト)を 破棄するように記述するようにした方が良いです。 メインフォームなら、 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Set Form1 = Nothing End End Sub サブフォームなら、 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Set Form2 = Nothing End Sub ※Form1、Form2はフォーム名です。
お礼
QueryUnloadには特に記述していませんでした。 ここでも破棄するように書いた方がいいのですね・・・ ありがとうございました。
- y_an
- ベストアンサー率57% (24/42)
フォームやクラスというプログラムの一部を終了(というかアンロード)するだけでなく、 プログラム全体(EXE)を終了するのであれば、 Endステートメントを使えば終了できます。 但し、終了する前に最後の状態を保存する等の処理は少し考えなければいけないと思います。 人によっては推奨しない人もいますが、 私は良くというか絶対使うようにしています。 どこで終了しているか明示的にする為に。 またVBのランタイムが入っていないのであれば、プログラムの実行すらできないと思いますが・・・。 昔のOSであれば入っていない可能性がありますが、 最近のOSでは何もインストールしなくても入っていると思います。 それか知らずに何かのインストーラにてインストールされる事もあると思います。 (ランタイムに関しては推測で自信ありません。)
お礼
Endは私も必ず使うようにしています。 OSはWin2000です。 だからかも知れませんが、プログラムの実行は できました。 ただ、必要なランタイムが足りなかったみたいです。 どうもありがとうございました。
フォームモジュールの中で監視、待機等の無限ループを行っている場合、 Unload Me としてもインスタンスを破棄できず、 DoEvents Unload Me で正常に終了できた、という経験があります。(VB6.0) 当然、ループの中にも、DoEventsを入れます。 (いつでも割り込みが入れられるように) コードの一部を抜粋すると、下記のような要領です。 Option Explicit Private UnLoadFlg As Boolean Private Sub cmdEnd_Click() UnLoadFlg = True DoEvents Unload Me End Sub Private Sub Form_Activate() Do Until UnLoadFlg '監視ロジック(省略) Call Sleep(50) DoEvents Loop End Sub Private Sub Form_Load() UnLoadFlg = False End Sub
お礼
今回のプログラムはループさせている ところはないのですが、勉強になりました。 ありがとうございます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
VBで作成したGUIのアプリは、フォームをすべてアンロードすれば終了します。 なので、見えないフォームが残っているんでしょう。 ロードしたフォームをすべてアンロードしていないためです。 自分ではアンロードしたつもりでも、アンロードした後にコントロールのプロパティを見たときに暗黙的にロードされて残ることもあります。
お礼
アンロード時にはロードされている 全てのフォームを閉じるようにしていました。 ただ、アンロード後に暗黙的にロードされて残ることも あることは知りませんでした。 ありがとうございます。
お礼
ありがとうございます。 ランタイムを入れたらちゃんと終了しました!