レジストリ エントリにアクセスする Java Service Wrapper アプリケーションがあります。(ええ、私は知っています、奇妙ですよね? ご参考までに、この質問に対するDavid のソリューションを使用して、Java を使用してレジストリから読み取ります。)
32 ビット バージョンの Windows では、すべて正常に動作します。コンソールから (Java Service Wrapper の .bat ファイルを使用して) アプリケーションを実行することも、bat ファイルからインストールされたサービスとしてアプリケーションを実行することもできます。Windows レジストリから、必要なさまざまなものを確認できます。
ただし、64 ビット Windows システムでは、アプリケーションをサービスとして実行するときに必要なレジストリ エントリが表示されなくなりました。エントリはすべて null のように見えます。ただし、コンソールでは引き続き機能します。
私の仮説は、コンソールから (関連する場合は管理ユーザーとして) Java Service Wrapper を実行すると、64 ビット JVM が開始され、通常の 64 ビット レジストリにアクセスできるというものです。次に、サービスとして (LOCALSYSTEM ユーザーを介して) 実行すると、32 ビット JVM が開始されます (これは、Wow6432 ビット ノードの非常に特別な 32 ビット レジストリにアクセスしようとします。探しているエントリは次のとおりです。このノードには存在しないため、この場合に null 値を取得する理由が説明されます。
これは私の質問につながります: Java Service Wrapper が、サービス リストから起動したときに 32 ビット JVM を起動するのはなぜですか? また、コンソールから起動したときに 64 ビット JVM を起動するのはなぜですか?
注:私はJava Service Wrapper 3.5.14を使用しており、設定ファイルに
wrapper.java.additional.auto_bits=TRUE
理想的には、JVM の選択を自動的に維持したいので、1 つのインストーラーを使用して 32 ビット システムと 64 ビット システムの両方にソフトウェアを展開できます。(実際、これが私が Tomcat ではなく JSW を使用することを選択した理由の 1 つです。)
読んでくれてありがとう。