2012-01-18 13 views
2

本質的に、新しいスレッドでSystem.Windows.Forms.Application.Run()を実行する拡張プログレスバーであるC#COM DLLを作成しましたフォームを表示するダイアログを表示します。 VBAを使用してサードパーティのアプリケーションでそれを使用するには、何かのように実行します。C#COM DLLがVBAアプリケーションの終了を妨げている

Set pg = CreateObject("MyNS.MyProgressBar") 
pg.ShowBar() 
. 
. 
pg.Progress = 0.5 
. 
. 
pg.ShutDownBar() 

問題)(ユーザーがpg.ShutDownBar前に(終了>ファイル - 使用して、または類似の)アプリケーションを閉じることができるということですが達成された。ユーザーがこれを行うと、pg.ShutDownBar()は呼び出されません。その結果、アプリケーションのウィンドウは非表示になりますが、それでもタスクマネージャのプロセスには表示されます。

私の質問は: 親アプリケーションがシャットダウンしたかどうかを検出して、C#の進行状況バーのスレッドを中止する方法はありますか?

ダイアログスレッドを開始するメインスレッドでSystem.Windows.Forms.Application.ThreadExitとSystem.Windows.Forms.ApplicationExitを試しましたが、COM経由でオブジェクトにアクセスするときにこれらのイベントが発生しないようです.NETでオブジェクトを作成すると呼び出されます)。

誰かからアドバイスをいただけますか?

+0

一般的なDoEvents()問題のようです。それを使用しないでください。 –

+0

DoEvents()を呼び出すコードはありません...別のスレッドでダイアログを開始するのにApplication.Runを使用せず、別のスレッドでform.ShowDialog()を使用していましたが、ダイアログは基本的にフリーズしています...なぜダニー? – MineR

+0

アプリケーション終了イベントでプログレスバーオブジェクトを 'Nothing'に設定するとどうなりますか? –

答えて

0

これは、COM参照カウントが機能する方法に問題があります。あなたのCOMラッパーを呼び出すプログラムが参照を解放しない限り(M. Babcockはプログラムが "set pg = Nothing"を実行するための手順を必要とすると提案しています)、プログレスバーは正しくシャットダウンされません。

私が作ることができる唯一の提案は、「タイムアウト」プロパティを設定することです(デフォルトは30秒と言います)。次に、プログレスバーのバックグラウンドスレッドを使用して、 "pg.Progess"への最後の呼び出しがどれぐらい前に行われたかを確認し、タイムアウト値がある場合はシャットダウンします。これは、ほとんどのVBスクリプトが少なくともX秒ごとに進捗状況を報告すると期待できると仮定しています(Xはタイムアウト値です)。

+0

はい!これはうまくいきます...私は新しいスレッドにウィンドウハンドルを送信し、ウィンドウハンドルがまだ有効かどうかを確認するために数秒ごとにチェックします。そうでなければ、それは閉じます。ありがとう! – MineR

関連する問題