首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ini4j编辑注册表

使用ini4j编辑注册表
EN

Stack Overflow用户
提问于 2011-07-15 20:31:33
回答 2查看 946关注 0票数 1

我目前正在开发一个java程序,我需要对注册表进行读/写。我看了几个API来做这件事,我找到了ini4j (ini4j Project Page)。我还需要编辑ini文件,所以我喜欢这个解决方案,因为它可以同时编辑这两个文件。我很好奇是否有人在这种情况下尝试过ini4j?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-05 21:58:02

我发现了一种读/写注册表的更好的解决方案,不需要ini4j或向命令行传递参数。我在我的程序中经常使用JNA,所以我认为使用本地库调用会更容易,而不是包含一个额外的库来为我做这件事。这是我的项目中的一个例子,我在注册表中搜索一个特定的键。特定密钥还取决于操作系统是x64还是x86。

代码语言:javascript
复制
   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。请随时提供另一种解决方案。

票数 1
EN

Stack Overflow用户

发布于 2016-12-21 23:22:44

不幸的是,您使用Platform.is64Bit()对64位进行的测试并不像您认为的那样……

它告诉你JVM是32位还是64位,而不是你的Windows是32位还是64位……

代码看起来像预期的那样工作的唯一原因是因为Windows注册表重定向器会为您处理所涉及的“魔法”(访问正确的注册表项)……

当您的代码在64位Windows上的32位JVM上运行时,如果您使用的是subkey32 (即"Software\Microsoft\Windows\CurrentVersion\Uninstall"). ),Platform.is64Bit()将返回false

不幸的是,我和你犯了同样的错误,在阅读了像你这样的帖子后,我发布了一个带有相同错误测试的程序,这就是为什么我现在发布这个帖子,尽管这个帖子已经有好几年了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6706979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档