モードレス VB6 アプリケーションは、アプリケーションのシャットダウン時にどのようにクリーンアップを行うことができますか?
-
02-07-2019 - |
質問
VB6 アプリケーションは、Interop Forms Toolkit を使用して、.NET で作成されたフォームを操作します。ツールキットのドキュメントでは、VB6 アプリケーションがシャットダウンするときにツールキットのメソッドを呼び出してツールキットに通知することが推奨されています。
VB6 アプリケーションは、スプラッシュ画面をロードし、いくつかのモードレス フォームを表示する Sub Main プロシージャを使用します。Sub Main が完了しても、アプリケーションはまだ実行中です。アプリケーションはどのようにしてシャットダウンを検出し、ツールキットのクリーンアップ メソッドを呼び出すことができるでしょうか?
解決
モジュール (おそらく Sub Main を含むものと同じもの) で、クリーンアップ コードを保持するパブリック サブルーチン (AppCleanUp など) を作成します。
プロジェクトにクラスを追加します (例:clsAppCleanup)。このクラスでは、前の手順で作成したサブルーチンを呼び出すコードを Class_Terminate イベント ハンドラーに追加します。
モジュール (おそらく Sub Main を含む同じモジュール) で、clsAppCleanup の変数を定義します。
Sub Main で、clsAppCleanup をインスタンス化します。
アプリがシャットダウンしているとき、クラスの終了イベントによりクリーンアップ コードが実行されます。
他のヒント
VB6 で書いたのは久しぶりですが、私の記憶が正しければ、Unload イベントを使用してクリーンアップ コードを呼び出すことができます (.net の終了イベントに似ています)。また、VB6 アプリ内にまだ実行中の他のフォームがないことを確認することもできます。
FormCount 変数を含むモジュールを作成します。この変数は、アプリケーション内のすべてのフォームで共有されます。すべてのフォームの Form_Initialize メソッドで FormCount 変数をインクリメントします。すべてのフォームの Form_Terminate メソッドで FormCount をデクリメントします。FormCount が 0 に戻ったら、フォームがアンロードされたことをフォーム ツールキットに通知できます。
VB6 はシングルスレッド アプリケーションを作成するため、マルチスレッドの問題を心配する必要はありません。そのため、1 つのフォームの Initialize (または Terminate) メソッドは、他のフォームの実行が開始される前に完了まで実行されます。