设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2304|回复: 0
打印 上一主题 下一主题

[转载] Win32::Registry 注册表

[复制链接]

Lv1.梦旅人

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
跳转到指定楼层
1
发表于 2011-10-20 15:18:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 英顺的马甲 于 2011-10-20 15:20 编辑

转载自 http://code.google.com/p/rmxp-sc ... b?spec=svn4&r=4
用法与 Ruby 的 Win32::Registry 一样,
只是少了一个功能,
那个我也不知道是什么功能,
这个用起来比 注册表v0.1 简单多了
  1. module Win32
  2.   class Registry
  3.     module Constants
  4.       #These are all the constants needed for what we want.
  5.       HKEY_CLASSES_ROOT = 0x80000000
  6.       HKEY_CURRENT_USER = 0x80000001
  7.       HKEY_LOCAL_MACHINE = 0x80000002
  8.       HKEY_USERS = 0x80000003
  9.       HKEY_PERFORMANCE_DATA = 0x80000004
  10.       HKEY_PERFORMANCE_TEXT = 0x80000050
  11.       HKEY_PERFORMANCE_NLSTEXT = 0x80000060
  12.       HKEY_CURRENT_CONFIG = 0x80000005
  13.       HKEY_DYN_DATA = 0x80000006

  14.       REG_NONE = 0
  15.       REG_SZ = 1
  16.       REG_EXPAND_SZ = 2
  17.       REG_BINARY = 3
  18.       REG_DWORD = 4
  19.       REG_DWORD_LITTLE_ENDIAN = 4
  20.       REG_DWORD_BIG_ENDIAN = 5
  21.       REG_LINK = 6
  22.       REG_MULTI_SZ = 7
  23.       REG_RESOURCE_LIST = 8
  24.       REG_FULL_RESOURCE_DESCRIPTOR = 9
  25.       REG_RESOURCE_REQUIREMENTS_LIST = 10
  26.       REG_QWORD = 11
  27.       REG_QWORD_LITTLE_ENDIAN = 11

  28.       STANDARD_RIGHTS_READ = 0x00020000
  29.       STANDARD_RIGHTS_WRITE = 0x00020000
  30.       KEY_QUERY_VALUE = 0x0001
  31.       KEY_SET_VALUE = 0x0002
  32.       KEY_CREATE_SUB_KEY = 0x0004
  33.       KEY_ENUMERATE_SUB_KEYS = 0x0008
  34.       KEY_NOTIFY = 0x0010
  35.       KEY_CREATE_LINK = 0x0020
  36.       KEY_READ = STANDARD_RIGHTS_READ |
  37.         KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
  38.       KEY_WRITE = STANDARD_RIGHTS_WRITE |
  39.         KEY_SET_VALUE | KEY_CREATE_SUB_KEY
  40.       KEY_EXECUTE = KEY_READ
  41.       KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK

  42.       REG_OPTION_RESERVED = 0x0000
  43.       REG_OPTION_NON_VOLATILE = 0x0000
  44.       REG_OPTION_VOLATILE = 0x0001
  45.       REG_OPTION_CREATE_LINK = 0x0002
  46.       REG_OPTION_BACKUP_RESTORE = 0x0004
  47.       REG_OPTION_OPEN_LINK = 0x0008
  48.       REG_LEGAL_OPTION = REG_OPTION_RESERVED |
  49.         REG_OPTION_NON_VOLATILE | REG_OPTION_CREATE_LINK |
  50.         REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK

  51.       REG_CREATED_NEW_KEY = 1
  52.       REG_OPENED_EXISTING_KEY = 2

  53.       REG_WHOLE_HIVE_VOLATILE = 0x0001
  54.       REG_REFRESH_HIVE = 0x0002
  55.       REG_NO_LAZY_FLUSH = 0x0004
  56.       REG_FORCE_RESTORE = 0x0008
  57.            
  58.       MAX_KEY_LENGTH = 514
  59.       MAX_VALUE_LENGTH = 32768
  60.     end
  61.     include Constants
  62.     include Enumerable
  63.    
  64.     #
  65.     # Error
  66.     #
  67.     class Error < ::StandardError
  68.       FormatMessageA = Win32API.new('kernel32.dll', 'FormatMessageA', 'LPLLPLP', 'L')
  69.       def initialize(code)
  70.         @code = code
  71.         msg = "\0" * 1024
  72.         len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0)
  73.         super msg[0, len].tr("\r", '').chomp
  74.       end
  75.       attr_reader :code
  76.     end
  77.    
  78.     #
  79.     # Predefined Keys
  80.     #
  81.     class PredefinedKey < Registry
  82.       def initialize(hkey, keyname)
  83.         @hkey = hkey
  84.         @parent = nil
  85.         @keyname = keyname
  86.         @disposition = REG_OPENED_EXISTING_KEY
  87.       end
  88.      
  89.       # Predefined keys cannot be closed
  90.       def close
  91.         raise Error.new(5) ## ERROR_ACCESS_DENIED
  92.       end
  93.      
  94.       # Fake class for Registry#open, Registry#create
  95.       def class
  96.         Registry
  97.       end
  98.      
  99.       # Make all
  100.       Constants.constants.grep(/^HKEY_/) do |c|
  101.         Registry.const_set c, new(Constants.const_get(c), c)
  102.       end
  103.     end
  104.    
  105.     #
  106.     # Win32 APIs
  107.     #
  108.     module API
  109.       [
  110.         %w/RegOpenKeyExA     LPLLP        L/,
  111.         %w/RegQueryValueExA  LPLPPP       L/,
  112.         %w/RegCreateKeyExA   LPLLLLPPP    L/,
  113.         %w/RegEnumValue      LLPPPPPP     L/,
  114.         %w/RegEnumKeyExA     LLPPLLLP     L/,
  115.         %w/RegSetValueExA    LPLLPL       L/,
  116.         %w/RegDeleteValue    LP           L/,
  117.         %w/RegDeleteKey      LP           L/,
  118.         %w/RegCloseKey       L            L/,
  119.         %w/RegQueryInfoKey   LPPPPPPPPPPP L/,
  120.       ].each do |fn|
  121.         const_set fn[0].intern, Win32API.new('advapi32.dll', *fn)
  122.       end
  123.      
  124.       module_function
  125.      
  126.       def check(result)
  127.         raise Error, result, caller(2) if result != 0
  128.       end
  129.      
  130.       def packdw(dw)
  131.         [dw].pack('V')
  132.       end
  133.      
  134.       def unpackdw(dw)
  135.         dw += [0].pack('V')
  136.         dw.unpack('V')[0]
  137.       end
  138.            
  139.       def OpenKey(hkey, name, opt, desired)
  140.         result = packdw(0)
  141.         check RegOpenKeyExA.call(hkey, name, opt, desired, result)
  142.         unpackdw(result)
  143.       end
  144.       
  145.       def CreateKey(hkey, name, opt, desired)
  146.         result = packdw(0)
  147.         disp = packdw(0)
  148.         check RegCreateKeyExA.call(hkey, name, 0, 0, opt, desired,
  149.                                    0, result, disp)
  150.         [ unpackdw(result), unpackdw(disp) ]
  151.       end
  152.                  
  153.       def QueryValue(hkey, name)
  154.         type = packdw(0)
  155.         size = packdw(0)
  156.         check RegQueryValueExA.call(hkey, name, 0, type, 0, size)
  157.         data = ' ' * unpackdw(size)
  158.         check RegQueryValueExA.call(hkey, name, 0, type, data, size)
  159.         [ unpackdw(type), data[0, unpackdw(size)] ]
  160.       end
  161.       
  162.       def EnumValue(hkey, index)
  163.         name = ' ' * Constants::MAX_KEY_LENGTH
  164.         size = packdw(Constants::MAX_KEY_LENGTH)
  165.         check RegEnumValueA.call(hkey, index, name, size, 0, 0, 0, 0)
  166.         name[0, unpackdw(size)]
  167.       end

  168.       def EnumKey(hkey, index)
  169.         name = ' ' * Constants::MAX_KEY_LENGTH
  170.         size = packdw(Constants::MAX_KEY_LENGTH)
  171.         wtime = ' ' * 8
  172.         check RegEnumKeyExA.call(hkey, index, name, size, 0, 0, 0, wtime)
  173.         [ name[0, unpackdw(size)], unpackqw(wtime) ]
  174.       end
  175.       
  176.       def DeleteValue(hkey, name)
  177.         check RegDeleteValue.call(hkey, name)
  178.       end

  179.       def DeleteKey(hkey, name)
  180.         check RegDeleteKey.call(hkey, name)
  181.       end
  182.       
  183.       def SetValue(hkey, name, type, data, size)
  184.         check RegSetValueExA.call(hkey, name, 0, type, data, size)
  185.       end
  186.      
  187.       def CloseKey(hkey)
  188.         check RegCloseKey.call(hkey)
  189.       end
  190.       
  191.       def QueryInfoKey(hkey)
  192.         subkeys = packdw(0)
  193.         maxsubkeylen = packdw(0)
  194.         values = packdw(0)
  195.         maxvaluenamelen = packdw(0)
  196.         maxvaluelen = packdw(0)
  197.         secdescs = packdw(0)
  198.         wtime = ' ' * 8
  199.         check RegQueryInfoKey.call(hkey, 0, 0, 0, subkeys, maxsubkeylen, 0,
  200.           values, maxvaluenamelen, maxvaluelen, secdescs, wtime)
  201.         [ unpackdw(subkeys), unpackdw(maxsubkeylen), unpackdw(values),
  202.           unpackdw(maxvaluenamelen), unpackdw(maxvaluelen),
  203.           unpackdw(secdescs), unpackqw(wtime) ]
  204.       end
  205.     end
  206.       
  207.     #
  208.     # constructors
  209.     #
  210.     private_class_method :new
  211.    
  212.     def self.open(hkey, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED)
  213.       subkey = subkey.chomp('\\')
  214.       newkey = API.OpenKey(hkey.hkey, subkey, opt, desired)
  215.       obj = new(newkey, hkey, subkey, REG_OPENED_EXISTING_KEY)
  216.       if block_given?
  217.         begin
  218.           yield obj
  219.         ensure
  220.           obj.close
  221.         end
  222.       else
  223.         obj
  224.       end
  225.     end
  226.    
  227.     def self.create(hkey, subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED)
  228.       newkey, disp = API.CreateKey(hkey.hkey, subkey, opt, desired)
  229.       obj = new(newkey, hkey, subkey, disp)
  230.       if block_given?
  231.         begin
  232.           yield obj
  233.         ensure
  234.           obj.close
  235.         end
  236.       else
  237.         obj
  238.       end
  239.     end
  240.    
  241.     #
  242.     # finalizer
  243.     #
  244.     @@final = proc { |hkey| proc { API.CloseKey(hkey[0]) if hkey[0] } }
  245.    
  246.     #
  247.     # initialize
  248.     #
  249.     def initialize(hkey, parent, keyname, disposition)
  250.       @hkey = hkey
  251.       @parent = parent
  252.       @keyname = keyname
  253.       @disposition = disposition
  254.       @hkeyfinal = [ hkey ]
  255.       ObjectSpace.define_finalizer self, @@final.call(@hkeyfinal)
  256.     end
  257.     attr_reader :hkey, :parent, :keyname, :disposition
  258.    
  259.     #
  260.     # attributes
  261.     #   
  262.     def open?
  263.       [email protected]?
  264.     end
  265.    
  266.     def name
  267.       parent = self
  268.       name = @keyname
  269.       while parent = parent.parent
  270.         name = parent.keyname + '\\' + name
  271.       end
  272.       name
  273.     end
  274.    
  275.     def inspect
  276.       "\#<Win32::Registry key=#{name.inspect}>"
  277.     end
  278.    
  279.     #
  280.     # marshalling
  281.     #
  282.     def _dump(depth)
  283.       raise TypeError, "can't dump Win32::Registry"
  284.     end
  285.    
  286.     #
  287.     # open/close
  288.     #
  289.     def open(subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED, &blk)
  290.       self.class.open(self, subkey, desired, opt, &blk)
  291.     end
  292.    
  293.     def create(subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED, &blk)
  294.       self.class.create(self, subkey, desired, opt, &blk)
  295.     end
  296.       
  297.     def close
  298.       API.CloseKey(@hkey)
  299.       @hkey = @parent = @keyname = nil
  300.       @hkeyfinal[0] = nil
  301.     end
  302.    
  303.     #
  304.     # each
  305.     #
  306.     def each_value
  307.       index = 0
  308.       while true
  309.         begin
  310.           subkey = API.EnumValue(@hkey, index)
  311.         rescue Error
  312.           break
  313.         end
  314.         begin
  315.           type, data = read(subkey)
  316.         rescue Error
  317.           next
  318.         end
  319.         yield subkey, type, data
  320.         index += 1
  321.       end
  322.       index
  323.     end
  324.     alias each each_value
  325.    
  326.     def each_key
  327.       index = 0
  328.       while true
  329.         begin
  330.           subkey, wtime = API.EnumKey(@hkey, index)
  331.         rescue Error
  332.           break
  333.         end
  334.         yield subkey, wtime
  335.         index += 1
  336.       end
  337.       index
  338.     end
  339.    
  340.     def keys
  341.       keys_ary = []
  342.       each_key { |key,| keys_ary << key }
  343.       keys_ary
  344.     end
  345.    
  346.     #
  347.     # reader
  348.     #
  349.     def read(name, *rtype)
  350.       type, data = API.QueryValue(@hkey, name)
  351.       unless rtype.empty? or rtype.include?(type)
  352.         raise TypeError, "Type mismatch (expect #{rtype.inspect} but #{type} present)"
  353.       end
  354.       case type
  355.       when REG_SZ, REG_EXPAND_SZ
  356.         [ type, data.chop ]
  357.       when REG_MULTI_SZ
  358.         [ type, data.split(/\0/) ]
  359.       when REG_BINARY
  360.         [ type, data ]
  361.       when REG_DWORD
  362.         [ type, API.unpackdw(data) ]
  363.       when REG_DWORD_BIG_ENDIAN
  364.         [ type, data.unpack('N')[0] ]
  365.       when REG_QWORD
  366.         [ type, API.unpackqw(data) ]
  367.       else
  368.         raise TypeError, "Type #{type} is not supported."
  369.       end
  370.     end
  371.    
  372.     def [](name, *rtype)
  373.       type, data = read(name, *rtype)
  374.       case type
  375.       when REG_SZ, REG_DWORD, REG_QWORD, REG_MULTI_SZ
  376.         data
  377.       when REG_EXPAND_SZ
  378.         Registry.expand_environ(data)
  379.       else
  380.         raise TypeError, "Type #{type} is not supported."
  381.       end
  382.     end
  383.       
  384.     def read_s(name)
  385.       read(name, REG_SZ)[1]
  386.     end
  387.    
  388.     def read_s_expand(name)
  389.       type, data = read(name, REG_SZ, REG_EXPAND_SZ)
  390.       if type == REG_EXPAND_SZ
  391.         Registry.expand_environ(data)
  392.       else
  393.         data
  394.       end
  395.     end
  396.    
  397.     def read_i(name)
  398.       read(name, REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_QWORD)[1]
  399.     end
  400.    
  401.     def read_bin(name)
  402.       read(name, REG_BINARY)[1]
  403.     end
  404.    
  405.     #
  406.     # writer
  407.     #
  408.     def write(name, type, data)
  409.       case type
  410.       when REG_SZ, REG_EXPAND_SZ
  411.         data = data.to_s + "\0"
  412.       when REG_MULTI_SZ
  413.         data = data.to_a.join("\0") + "\0\0"
  414.       when REG_BINARY
  415.         data = data.to_s
  416.       when REG_DWORD
  417.         data = API.packdw(data.to_i)
  418.       when REG_DWORD_BIG_ENDIAN
  419.         data = [data.to_i].pack('N')
  420.       when REG_QWORD
  421.         data = API.packqw(data.to_i)
  422.       else
  423.         raise TypeError, "Unsupported type #{type}"
  424.       end
  425.       API.SetValue(@hkey, name, type, data, data.length)
  426.     end
  427.    
  428.     def []=(name, rtype, value = nil)
  429.       if value
  430.         write name, rtype, value
  431.       else
  432.         case value = rtype
  433.         when Integer
  434.           write name, REG_DWORD, value
  435.         when String
  436.           write name, REG_SZ, value
  437.         when Array
  438.           write name, REG_MULTI_SZ, value
  439.         else
  440.           raise TypeError, "Unexpected type #{value.class}"
  441.         end
  442.       end
  443.       value
  444.     end
  445.    
  446.     def write_s(name, value)
  447.       write name, REG_SZ, value.to_s
  448.     end
  449.    
  450.     def write_i(name, value)
  451.       write name, REG_DWORD, value.to_i
  452.     end
  453.    
  454.     def write_bin(name, value)
  455.       write name, REG_BINARY, value.to_s
  456.     end
  457.    
  458.     #
  459.     # delete
  460.     #
  461.    
  462.     def delete_value(name)
  463.       API.DeleteValue(@hkey, name)
  464.     end
  465.     alias delete delete_value
  466.    
  467.     def delete_key(name, recursive = false)
  468.       if recursive
  469.         open(name, KEY_ALL_ACCESS) do |reg|
  470.           reg.keys.each do |key|
  471.             begin
  472.               reg.delete_key(key, true)
  473.             rescue Error
  474.               #
  475.             end
  476.           end
  477.         end
  478.         API.DeleteKey(@hkey, name)
  479.       else
  480.         begin
  481.           API.EnumKey @hkey, 0
  482.         rescue Error
  483.           return API.DeleteKey(@hkey, name)
  484.         end
  485.         raise Error.new(5) ## ERROR_ACCESS_DENIED
  486.       end
  487.     end
  488.    
  489.     #
  490.     # info
  491.     #
  492.     def info
  493.       API.QueryInfoKey(@hkey)
  494.     end
  495.            
  496.     %w[
  497.       num_keys max_key_length
  498.       num_values max_value_name_length max_value_length
  499.       descriptor_length wtime
  500.     ].each_with_index do |s, i|
  501.       eval <<-__END__
  502.         def #{s}
  503.           info[#{i}]
  504.         end
  505.       __END__
  506.     end
  507.   end
  508. end
复制代码
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 00:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表