私は現在Javaプログラムに取り組んでおり、レジストリに対して読み取り/書き込みを行う必要があります。これを行うためにいくつかのAPIを調べましたが、ini4j(ini4jプロジェクトページ)が見つかりました。また、iniファイルを編集する必要があるので、両方を実行するため、このソリューションが気に入っています。このタイプのシナリオで誰かがini4jを試したことがあるかどうか知りたいですか?
2 に答える
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が発生し続けたため、オブジェクトを使用して最初にキー値を格納しました。別の解決策を自由に提供してください。
残念ながら、Platform.is64Bit()を使用した64ビットのテストでは、思ったとおりに動作しません...
これは、Windowsが32ビットまたは64ビットであるかどうかではなく、JVMが32ビットまたは64ビットであるかどうかを示します。
コードが意図したとおりに機能しているように見える唯一の理由は、Windowsレジストリリダイレクタが関連する「魔法」(正しいレジストリキーへのアクセス)を処理するためです...
コードが64ビットのWindowsプラットフォーム上の32ビットのJVMで実行される場合、is64Bit()はfalseを返し、subkey32(つまり、「Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall」)を使用しています。
残念ながら、あなたと同じ過ちを犯し、あなたのようなスレッドを読んだ後、同じ誤ったテストでプログラムをリリースしたので、このスレッドは数年前ですが、今これを投稿しています。