[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/08(Sun) 12:58
投稿者名:かずゆき
Eメール:
URL :
タイトル:
VBのプログラムのプロセスが残る
はじめまして

WindowsXPでVB6.0を利用しておりますが、
EXEファイルを作成して、実行した後、フォームの「×」ボタンを押して
終了しようとすると、デスクトップ上からは消えます。
しかし、タスクマネージャを見るとプロセスに残ってしまっています。

ただ、いつも残るのではなく、フォームからメッセージボックスを
表示させた場合にのみプロセスがのこり、起動してメッセージボックスを表示させずに
「×」ボタンを押したときは残りません。

フォームには
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Unload Me
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Unload Me
End Sub
のように記述しております。

解決方法をご存知の方がいらっしゃいましたら、どうかご教授下さいませ。

投稿時間:2007/07/09(Mon) 01:52
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: VBのプログラムのプロセスが残る
現象を再現できないので、コード内容について逆質問。

(1)Timer コントロールを利用していますか?

(2)DoEvents を利用していますか?

(3)自フォーム内のコントロールやプロパティにアクセスする際に、
 Form1.Text1.Text のような構文を使ってはいませんか?

(4)複数のフォームを利用する際、フォームへのアクセスは
 Set F = New Form2
 F.Show
のように、自分で New したインスタンスを利用していますか? それとも、
 Form2.Show
のように、暗黙生成されるフォーム名変数を利用していますか?

投稿時間:2007/07/10(Tue) 03:04
投稿者名:かずゆき
Eメール:
URL :
タイトル:
Re^2: VBのプログラムのプロセスが残る
魔界の仮面弁士様

返信ありがとうございます。
コード内容は…
(1)Timer コントロールは使用していません。
(2)DoEvents は利用していません。
(3)ご指摘のとおりの構文を使っています。
(4)インスタンスを利用せず、暗黙生成されるフォーム名変数を利用しています。
となります。

以上ですが、よろしくお願いいたします。

投稿時間:2007/07/10(Tue) 09:20
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: VBのプログラムのプロセスが残る
よくある可能性としては、
  アンロードされているフォーム上のプロパティ(あるいはコントロール)を
  操作しようとしたため、自動的にフォームが(非表示状態で)ロードされてしまい、
  アプリが終了しなくなっているかのように見えてしまう。
という状況が考えられます。

意図せぬロードを防ぐため、フォームのロード状況をログに記録してみてください。

デバッグ実行時には「Debug.Print」メソッド、EXE にコンパイルしての実行時には、
「App.LogEvent」メソッド(および、StartLogging メソッド)を使って記録すると良いでしょう。


Option Explicit

Private Sub Form_Initialize()
    Debug.Print Hex(ObjPtr(Me)) & ":Form1/Initialize"
    '
    'ここに、通常の Form_Initialize 処理を記述
    '
End Sub

Private Sub Form_Load()
    Debug.Print Hex(ObjPtr(Me)) & ":Form1/Load"
    '
    'ここに、通常の Form_Load 処理を記述
    '
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Debug.Print Hex(ObjPtr(Me)) & ":Form1/Unload"
    '
    'ここに、通常の Form_Unload 処理を記述
    '
End Sub

Private Sub Form_Terminate()
    Debug.Print Hex(ObjPtr(Me)) & ":Form1/Terminate"
    '
    'ここに、通常の Form_Terminate 処理を記述
    '
End Sub

上記のように、それぞれのフォームの Initialize/Load/Unload/Terminate イベントにて、
トレースコードを埋め込んでおき、動作チェックを行います。
その結果、もし、途中で予期せぬ Load が発生しているようであれば、さらに、
どの処理を行ったときに、どのフォームがロードされたのかを追跡してみてください。
暗黙の自動ロードを排除できれば、アプリが残ってしまう件も解決すると思われます。


また、そうしたコーディングミス以外の可能性としては、アプリケーション内で
使用しているコンポーネントの都合による場合もあります。

たとえば、一部の通信系コンポーネントでは、コネクションの切断までに
数分程度の時間を要するという都合上、フォームを閉じても、しばらくの間は
アプリケーションが生き残り続けてしまうようなものもあります。


>> (3)自フォーム内のコントロールやプロパティにアクセスする際に、
>> Form1.Text1.Text のような構文を使ってはいませんか?
> (3)ご指摘のとおりの構文を使っています。

自フォーム上のモノにアクセスするのであれば、
 Me.Text1.Text
の構文を使ってみてください。

投稿時間:2007/07/10(Tue) 23:24
投稿者名:かずゆき
Eメール:
URL :
タイトル:
Re^4: VBのプログラムのプロセスが残る
魔界の仮面弁士様

解決いたしました!

教えて頂きました方法などを使いながらソースをよく見てみると、
 1.メニューフォームのBフォームを呼び出すボタンを押す
 2.Bフォームをロード
 3.Bフォームに設定するデータをAccessからデータ取得
 4.取得データが0件だった場合、0件である旨のメッセージボックスを出力
 5.Bフォームを表示せずに、メニュー画面に戻る
となっており、5でBフォームをUnloadする処理を書かずにexit subと書いていたため、
見た目はメニュー画面しか表示されていませんがBフォームがロードされたままの
状態でした。

おかげさまで、プロセスに残らなくなりました。
本当にありがとうございました。