Использование ini4j для редактирования реестра Windows - PullRequest
1 голос
/ 15 июля 2011

Я сейчас работаю над Java-программой, и мне нужно читать / писать в реестр.Я посмотрел на несколько API, чтобы сделать это, и я нашел ini4j ( ini4j Project Page ).Мне также нужно отредактировать INI-файлы, поэтому мне нравится это решение, потому что оно делает и то, и другое.Мне любопытно, кто-нибудь пробовал ini4j в сценарии такого типа?

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Я нашел лучшее решение для чтения / записи в реестр без необходимости ini4j или передачи аргументов в командную строку.Я довольно часто использую JNA в своей программе, поэтому я подумал, что было бы проще использовать вызовы нативных библиотек вместо того, чтобы включать дополнительную библиотеку, чтобы сделать это для меня.Вот пример из моего проекта, где я искал в реестре конкретный ключ.Конкретный ключ также зависит от того, является ли ОС 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 голосов
/ 21 декабря 2016

К сожалению, ваш тест на 64 бита с использованием Platform.is64Bit () не делает то, что вы думаете ...

Он сообщает, является ли ваша JVM 32-битной или 64-битной, а не Windows 32-битной или 64-битной ...

Единственная причина, по которой ваш код работает должным образом, заключается в том, что перенаправитель реестра Windows позаботится о "магии" (доступ к нужному разделу реестра) за вас ...

Когда ваш код работает на 32-битной JVM на 64-битной Windows Platform.is64Bit () возвращает false, и вы используете subkey32 (то есть «Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall»).

Я, к сожалению, сделал ту же ошибку, что и вы, и выпустил программу с таким же ошибочным тестом после прочтения темы, как у вас, поэтому я сейчас публикую это, хотя этой теме уже несколько лет.

...