2011-07-15 16 views
1

現在、Javaプログラムで作業しており、レジストリを読み書きする必要があります。私はこれを行うためにいくつかのAPIを見て、私はini4j(ini4j Project Page)が見つかりました。私もiniファイルを編集する必要がありますので、私はこのソリューションを気に入っています。誰かがこのタイプのシナリオでini4jを試してみたらどうかと思っています。ini4jを使用してWindowsレジストリを編集する

答えて

1

私は、ini4jや引数をコマンドラインに渡すことなく、レジストリへの読み書きのためのより良いソリューションを見つけました。自分のプログラムでJNAをかなり使っていますので、これを行うライブラリを追加するのではなく、ネイティブライブラリ呼び出しを使用する方が簡単だと思いました。ここでは、特定のキーを探してレジストリを検索していた私のプロジェクトの例を示します。特定のキーは、OSがx64またはx86であるかどうかによっても異なります。

public static String GetUninstallerPath() { 
     try { 
      //if (logger.IsInfoEnabled) logger.Info("GetUninstallerPath - begin"); 

      String uninstallerPath = null; 

      try { 
       String vncDisplayName = "UltraVNC"; 
       String subkey32 = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; 
       String subkey64 = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; 

       boolean is64Bit = Platform.is64Bit(); 
       String[] key; 
       if (is64Bit) { 
        key = Advapi32Util.registryGetKeys(WinReg.HKEY_LOCAL_MACHINE, 
          subkey64); 
       } else { 
        key = Advapi32Util.registryGetKeys(WinReg.HKEY_LOCAL_MACHINE, 
          subkey32); 
       } 

       if (key != null) { 
        for (String nextSubkeyName : key) { 

         TreeMap<String, Object> subKey = Advapi32Util.registryGetValues(
           WinReg.HKEY_LOCAL_MACHINE, 
           subkey64 + "\\" + nextSubkeyName); 
         Object value = subKey.get("DisplayName"); 
         Object path = null; 
         if (value != null) { 
          if (value.toString().startsWith(vncDisplayName)) { 
           path = subKey.get("UninstallString"); 
           if (path != null) { 
            uninstallerPath = path.toString().trim(); 
           } 
          } 
         } 

        } 

       } 

      } 
      catch (Exception ex) { 
       System.err.println(ex.getMessage()); 

      } 

      return uninstallerPath; 
     } 
    } 

私はNullPointerExceptionsを取得していたので、キー値を最初に格納するオブジェクトを使用します。別の解決策を提供してください。

0

残念ながらPlatform.is64Bitを(使用して64ビット)のためのテストは、あなたがそれがないと思う何をしません...

あなたのJVMは、32ビットまたは64ビットである場合、それはあなたのWindowsではありません場合は、あなたに伝えます32ビットまたは64ビット...

あなたのコードが意図したとおりに動作するように見える唯一の理由は、Windowsレジストリリダイレクタがあなたのために(正しいレジストリキーにアクセスする)「マジック」を処理するからです。

64ビットWindowsプラットフォーム上の32ビットJVMでコードを実行すると、is64Bit()がfalseを返し、サブキー32を使用しています(つまり、 "Software \ Microsoft \ Wi ndows \ CurrentVersion \ Uninstall ")。

私は残念なことにあなたと同じ間違いを犯し、あなたのような読書スレッドの後に同じ誤りのあるテストでプログラムをリリースしました。なぜなら、このスレッドが数年前でも投稿している理由です。

関連する問題