从Windows注册表中读取DWord

3

如何使用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);

有什么想法吗?
2个回答

2

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

我找到了一个项目来处理这个问题,通过调用Runtime.exec()和regedit.exe,这相当肮脏,但可能对其他遇到相同问题的人有帮助。 这个项目与您的字符串使用相同的方法。 http://sourceforge.net/projects/java-registry/

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


1

我发现读取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是常量。它们的值取决于您的查询路径和查询键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接