免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4133 | 回复: 0
打印 上一主题 下一主题

在 Java 中操作 Windows 注册表 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-25 11:53 |只看该作者 |倒序浏览

想做个东西,要获IE的代理设置,看网上介绍基本都是读取注册表的方式,没提到说借助于特定的 Win32 API。而 JDK 提供操作 Windows 的 API 也就是 Preferences,因为这个 API 也是跨平台的,所功能比较弱,在 Win32 下只能用来操作 HKCU\Software\JavaSoft 和 HKLM\Software\JavaSoft 下及子节点的数据。
自由访问注册表其他键的值光用 Java 是做不到的,必然方案就是 JNI,一开始也自己来实现这个 JNI 动态库,后来懒了一下,想着网上应该用现成的实现,Google 了一下,果然不出所望,就是
http://www.trustice.com/java/jnireg/index.shtml
下的
registry-3.1.3.zip
(包含源代码)。可以利用它访问、修改、导出注册表项到文件等。解开 registry-3.1.3.zip,在 bin 目录中可以看到两个文件 ICE_JNIRegistry.dll 和 registry.jar,动态库就是本地代码实现。
com.ice.jni.registry.Registry.main() 就是 registry 的示例代码,动态库 ICE_JNIRegistry.dll 也是在这个类的静态块中被加载的,记得要把 ICE_JNIRegistry.dll 放在它能够被加载的位置上,比如你把 registry-3.1.3.zip 解压到 c:\registry-3.1.3,在命令行下你可以进入到这个目录中,并执行
c:\registry-3.1.3>java -cp registry.jar com.ice.jni.registry.Registry
就可以在 command: 提示符下输入命令操作注册表了,输入 help 会打印出所有能用指令:
keys regKey -- print the key names
values regKey -- print the value names
data regKey subKey -- print the key's data
string regKey subKey -- print REG_SZ key's string
setbin regKey subKey   binaryString -- set REG_BINARY
setdw regKey subKey int -- set REG_DWORD
setstr regKey subKey string -- set REG_SZ
setmulti regKey subKey semiColonString -- set REG_MULTI_SZ
delkey regKey subKey -- delete key 'subKey' of regKey
delval regKey subKey -- delete value 'subKey' of regKey
export regKey fileName -- export registry key to fileName
expand regKey valueName -- expand string value

!! -- repeats last command
$$ -- re-uses previous keyname
Predefined Key Prefixes: (e.g. $0-9)
    $0=HKLM\System\CurrentControlSet\control
    $1=HKLM\Software
    $2=HKLM\Software\Miscrosoft
    $3=HKLM\Software\Microsoft\Windows\CurrentVersion
    $4=HKLM\Software\Microsoft\Windows\CurrentVersion\ProfileList
    $5=HKCU\Software
    $6=HKCU\Software\Microsoft
    $7=HKCU\AppEvents
    $8=HKCU\AppEvents\Schemes
    $9=HKCU\AppEvents\Schemes

比如要读取 IE 是否启用代理设置就可以输入指令
command: data "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\" ProxyEnable
显示结果为:
Value 'ProxyEnable' is [type=4,name=ProxyEnable]
REG_DWORD '0' [x00000000]

'0' 表示未启用 IE 代理设置,如果启用了代理设置,通过其他几个字符串值可获取到具体的代理设置。如
command: data "%6\\Windows\\CurrentVersion\\Internet Settings\\" ProxyServer
Value 'ProxyServer' is [type=1,name=ProxyServer]
REG_SZ 'ftp=proxy.unmi.com:21;gopher=proxy.unmi.com:8080;http=proxy.unmi.com:8080;https=proxy.unmi.com:8080'
上面用了一个内置变量 %6 来代表 HKCU\Software\Microsoft。
其他的指令,大家可以尝试一下,这里我主要是关注于读取键值的操作,接下来呢,我们来看看自己写代码如何来获取键值。应好好的参考 Registry 类的实现。
package com.unmi;   
  •    
    import com.ice.jni.registry.*;   
  •    
    /**   
  • * @author Unmi
    */   
  • public class RegistryManager   
    {   
  •    
         /**   
  •       * @param args
          * @throws RegistryException   
  •       * @throws NoSuchKeyException   
          */   
  •      public static void main(String[] args) throws NoSuchKeyException, RegistryException   
         {   
  •          RegistryKey registryKey = Registry.openSubkey(Registry.HKEY_CURRENT_USER,   
                  "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" ,   
  •               RegistryKey.ACCESS_READ);   
             RegistryValue registryValue = registryKey.getValue( "ProxyEnable" );   
  •          boolean proxyEnable = ((RegDWordValue)registryValue).getData()!= 0 ;   
                
  •          System.out.println( "IE 是否启用了代理设置: " +proxyEnable);   
                
  •          if (proxyEnable)   
             {   
  •              registryValue = registryKey.getValue( "ProxyServer" );   
                 System.out.println( "IE 代理服务器是: " + new String(registryValue.getByteData()));   
  •          }   
         }   
  • }   
    我在 IE 中为不同协议设置了代理后,执行上面程序的输出为(如果要取出 http 代理设置就分隔进行字符串处理了):
    IE 是否启用了代理设置: true
    IE 代理服务器是: ftp=proxy.unmi.com:21;gopher=proxy.unmi.com:8080;http=proxy.unmi.com:8080;https=proxy.unmi.com:8080

    如果对所有服务器均使用相同的代理服务器设置后,执行上面程序的输出为(默认就是 http 代理设置了):
    IE 是否启用了代理设置: true
    IE 代理服务器是: proxy.unmi.com:80

    大家可以继续挖掘 registry 的修改键值及创建子键的功能。


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94064/showart_2186519.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP