从 Windows 注册表中读取 DWord

Posted

技术标签:

【中文标题】从 Windows 注册表中读取 DWord【英文标题】:Reading DWord from Windows registry 【发布时间】:2011-02-27 12:55:21 【问题描述】:

如何使用 java.util.prefs.Preferences 从 Windows 注册表中读取 DWORD 值数据。 我可以读取 REG_SZ 类型的数据,但是读取 REG_DWORD 类型时返回 null。

Preferences userRoot = Preferences.userRoot();
Class clz = userRoot.getClass();
openKey = clz.getDeclaredMethod("openKey", byte[].class, int.class, int.class);
openKey.setAccessible(true);
final Method closeKey = clz.getDeclaredMethod("closeKey", int.class);
closeKey.setAccessible(true);

byte[] valb = null;
String key = null;
Integer handle = -1;
final Method winRegQueryValue = clz.getDeclaredMethod("WindowsRegQueryValueEx", int.class, byte[].class);
winRegQueryValue.setAccessible(true);

key = "Software\\SimonTatham\\PuTTY\\Sessions\\myMachine";
handle = (Integer) openKey.invoke(userRoot, toCstr(key), KEY_READ, KEY_READ);

//this line returns byte[] correctly
valb = (byte[]) winRegQueryValue.invoke(userRoot, handle.intValue(), toCstr("HostName"));

//but this line returns null instead of byte[] even though there is a value of type REG_DWORD
valb = (byte[]) winRegQueryValue.invoke(userRoot, handle.intValue(), toCstr("PortNumber"));

closeKey.invoke(Preferences.userRoot(), handle);

有什么想法吗?

【问题讨论】:

【参考方案1】:

我也有同样的问题。 您似乎无法使用 Java-Preferences 方法读取双字。 (你只能阅读字符串,我认为这永远不会改变)

我找到了一个通过调用 Runtime.exec() 来处理该问题的项目,而 regedit.exe 女巫非常肮脏,但可能会为遇到同样问题的其他人提供帮助。 该项目使用与您处理字符串相同的方法。 http://sourceforge.net/projects/java-registry/

您还可以使用 jRegistryKey.jar 和 dll(我想摆脱它们) 或其他原生接口,如http://www.trustice.com/java/jnireg/(我没试过)

【讨论】:

【参考方案2】:

我发现使用以下代码读取 REG_DWORD(Dword) 和 REG_SZ(String) 注册表的最简单方法

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;

public class ReadRegistry



    public static final String readRegistry(String location, String key)
        try 
            // Run reg query, then read output with StreamReader (internal class)
            Process process = Runtime.getRuntime().exec("reg query " +
                    '"'+ location + "\" /v " + key);

            StreamReader reader = new StreamReader(process.getInputStream());
            reader.start();
            process.waitFor();
            reader.join();

            // Parse out the value
            // String[] parsed = reader.getResult().split("\\s+");

            String s1[];
            try
             s1=reader.getResult().split("REG_SZ|REG_DWORD");
            
            catch(Exception e)
            
                return " ";
            
           //MK System.out.println(s1[1].trim());

            return s1[1].trim();
         catch (Exception e) 
        

        return null;
    
     static class StreamReader extends Thread 
        private InputStream is;
        private StringWriter sw= new StringWriter();

        public StreamReader(InputStream is) 
            this.is = is;
        

        public void run() 
            try 
                int c;
                while ((c = is.read()) != -1)
                    //System.out.println(c);
                    sw.write(c);
             catch (IOException e) 
            
        

        public String getResult() 
            return sw.toString();
        
    

您可以使用 trim 仅使用值并删除其他空格字符

如何使用这个类

代码如下

 String outputValue = ReadRegistry.readRegistry(REGISTRY_PATH, REGISTRY_KEY);

注意:REGISTRY_PATH 和 REGISTRY_KEY 是常量。它的值取决于您的查询路径和查询键。

【讨论】:

以上是关于从 Windows 注册表中读取 DWord的主要内容,如果未能解决你的问题,请参考以下文章

从 VB.NET 中的注册表获取实际 REG_DWORD 十进制数的另一种方法?

如何轻松将 LPBYTE 转换为 char[256](用于从 Windows 注册表读取文本)

注册表:DWORD

读取 Windows 注册表时命令是不是重要?

Delphi 读写注册表

注册表新建 -------DWORD(32-位)