Office オートメーションを使用しているときに Microsoft Office プロセス (つまり、Word、Excel) がハングしたかどうかを確認する方法はありますか? さらに、プロセスがハングした場合、プロセスを終了する方法はありますか?
3 に答える
サーバー上のサービスでこれを行うことはお勧めしませんが、質問に答えるために最善を尽くします。
サービスとして実行すると、クリーンアップが難しくなります。たとえば、サービスとして実行しているものでは、ハングした単語や Excel を強制終了します。サービスを強制終了しなければならない状況にある可能性があります。ワードやエクセルがこの状態だとサービスが停止しますか?
ハングしているかどうかをテストしようとする際の問題の 1 つは、サービスが実行されているものがまだハングしている間に、テストによって Word の新しいインスタンスが起動して機能する可能性があることです。
ハングしているかどうかを判断する最善の方法は、実行するはずのことを実行するように要求し、結果を確認することです。私はそれが実際に何をしているのかについてもっと知る必要があります。
クリーンアップのためにバッチ ファイルで使用するいくつかのコマンドを次に示します (両方ともパスにある必要があります)。
- sc stop servicename - servicename という名前のサービスを停止します
- sc start servicename - servicename という名前のサービスを開始します
sc query servicename - servicename のステータスを照会します
taskkill /F /IM excel.exe - excel.exe のすべてのインスタンスを終了します
数年前にこれを行ったことを覚えています。つまり、2007 年ではなく、Office XP または 2003 日のことを話しているのです。
最近の自動化のための明らかに優れたソリューションは、System.IO.Packaging 名前空間を使用して docx などを記述する新しい XML 形式を使用することです。
当時、私は、MSWord がバケツを蹴って十分な量になるたびに、「ワトソン博士」と呼ばれるプロセスがマシン上で実行されていることに気付きました。これが、Word がつまずいて倒れたという最初の手がかりでした。ときどき複数のWINWORD.EXEが表示されることがありますが、私のコードは良いドクターをスキャンするために使用されていました。それを (コードで) 確認したら、すべてのWINWORD.EXEプロセスをグッド ドクター自身で強制終了し、Word を拷問するプロセスを再開しました :-)
何を探すべきかについての手がかりが得られることを願っています。
ではごきげんよう、
ロブ G
PS 正しく来なければ、私のアーカイブからコードを掘り出すことさえできるかもしれません!
後半はお答えできます。コード内にアプリケーション オブジェクトへの参照がある場合は、単純に「Quit」を呼び出すことができます。
private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();
ハングしたプロセスをチェックするには、アプリケーションからデータを取得して、妥当な時間内に結果が得られるかどうかを確認する必要があると思います (タイマーまたは他のスレッドなどをチェックインします)。おそらくもっと良い方法があります。