• ベストアンサー

VBプログラムの終了

VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?

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

  • ベストアンサー
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

正常動作ならば、終了させれば プロセスも閉じられます。 VBのランタイムが 入ってない場合、異常終了で、ちゃんと終了してないと思われます。

SidaSida
質問者

お礼

ありがとうございます。 ランタイムを入れたらちゃんと終了しました!

その他の回答 (5)

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.6

作成した実行ファイル内での処理はどのようなことをしているのでしょうか? 大きな流れで、どのようなことをしているかわかれば適切な回答を得ることが出来るかもしれません。 ちなみに、既に回答されていますがVBランタイムがないとVBで作成された実行ファイルは動作することが出来ません。

SidaSida
質問者

お礼

プログラムはマスタ保守でした。 ランタイムを入れる前にプログラムは実行したのですが、 やはりOSが関係しているのでしょうかね? ありがとうございました。

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.5

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はフォーム名です。

SidaSida
質問者

お礼

QueryUnloadには特に記述していませんでした。 ここでも破棄するように書いた方がいいのですね・・・ ありがとうございました。

  • y_an
  • ベストアンサー率57% (24/42)
回答No.4

フォームやクラスというプログラムの一部を終了(というかアンロード)するだけでなく、 プログラム全体(EXE)を終了するのであれば、 Endステートメントを使えば終了できます。 但し、終了する前に最後の状態を保存する等の処理は少し考えなければいけないと思います。 人によっては推奨しない人もいますが、 私は良くというか絶対使うようにしています。 どこで終了しているか明示的にする為に。 またVBのランタイムが入っていないのであれば、プログラムの実行すらできないと思いますが・・・。 昔のOSであれば入っていない可能性がありますが、 最近のOSでは何もインストールしなくても入っていると思います。 それか知らずに何かのインストーラにてインストールされる事もあると思います。 (ランタイムに関しては推測で自信ありません。)

参考URL:
http://www.microsoft.com/japan/msdn/library/ja/vblr7/html/vastmend.asp
SidaSida
質問者

お礼

Endは私も必ず使うようにしています。 OSはWin2000です。 だからかも知れませんが、プログラムの実行は できました。 ただ、必要なランタイムが足りなかったみたいです。 どうもありがとうございました。

noname#4564
noname#4564
回答No.3

  フォームモジュールの中で監視、待機等の無限ループを行っている場合、 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  

SidaSida
質問者

お礼

今回のプログラムはループさせている ところはないのですが、勉強になりました。 ありがとうございます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

VBで作成したGUIのアプリは、フォームをすべてアンロードすれば終了します。 なので、見えないフォームが残っているんでしょう。 ロードしたフォームをすべてアンロードしていないためです。 自分ではアンロードしたつもりでも、アンロードした後にコントロールのプロパティを見たときに暗黙的にロードされて残ることもあります。

SidaSida
質問者

お礼

アンロード時にはロードされている 全てのフォームを閉じるようにしていました。 ただ、アンロード後に暗黙的にロードされて残ることも あることは知りませんでした。 ありがとうございます。