2009-07-18 9 views
2

javaw.exeを使用してJavaアプリケーションを起動している場合、ユーザーがWindowsアカウントからログオフするとシャットダウンフックは実行されません。 launch4jによって生成された.exeファイルを使用してアプリケーションが実際に起動されますが、javaw.exeを使用して起動します。javaw.exeを使用してアプリケーションを起動したときにシャットダウンフックが実行されない

これは既知のバグのようです:誰にもこの問題があった http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4302814

?もしそうなら、それをどうやって修正しましたか?

ありがとうございます!

+0

このアプリケーションはサービスですか?シャットダウンフックには何がありますか? – akarnokd

+0

これはサービスではなく、GUIアプリケーションです。私は埋め込みデータベースをシャットダウンし、アプリケーション設定を保存するためにフックを使用しています。 – Nicu

答えて

2

アプリケーションはlaunch4j生成.exeファイルを使用して実際に起動されますが、javaw.exeを使用して起動します。

私はしばらくのうちにlaunch4jを使用していませんが、これを直接行うとかなり驚いています。これらのアプリのほとんどは、javawに砲撃するのではなく、jvmを起動します。

java.exeとjavaw.exeの唯一の違いは、java.exeが自動的にコンソールを接続することです。 SunがWindowsのログオフイベントの処理を改善することに興味を持たないため、あなたが参照するバグ(およびそれによって参照されるバグ)は閉じられました。コンソール自体がシャットダウンプロセスを遅くするような方法でWM_MESSAGESを処理するので、私が知ることから、java.exeでのみ動作します。

現時点での簡単な回避策は、launch4j設定の「headerType」を「console」に変更することだけです。明らかに、これは醜いコンソールをもたらす。

私はもう一つの選択肢は、よりクリーンな方法でWindowsメッセージを処理するあなたのネイティブラッパーのいくつかの並べ替えを使用することだと思う。

+0

launch4jコードにはJNI_CreateJavaVMのトレースはありません。このファイルには、それを起動するコードが含まれていると思います。 http://launch4j.cvs.sourceforge.net/viewvc/launch4j/launch4j/head_src/head.c?view=markup – Nicu

+1

@nicu - Yikes、私は気付きませんでしたそれ。プロセスが「javaw.exe」としてタスクリストに表示されますか?とにかく、本当に助けに "stayAlive"を設定しますか?そうでない場合は、ネイティブコードでWMメッセージを自分でキャプチャすることに悩まされていると思われます。 : – jsight

+1

@jsight - 時間を割いてくれてありがとう私は自分自身のランチャーを書く必要がないように、この問題の簡単な解決策があることを願っていた。 1. Launch4jはプロセス名を変更するのでjavaw.exe 2. stayAliveの設定は役に立ちません。タスクリストに同じ名前の2つのプロセスがあります。 – Nicu

関連する問題