# File dl/win32/lib/win32/registry.rb, line 542
def self.create(hkey, subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED)
newkey, disp = API.CreateKey(hkey.hkey, subkey, opt, desired)
obj = new(newkey, hkey, subkey, disp)
if block_given?
begin
yield obj
ensure
obj.close
end
else
obj
end
end
utility functions
# File dl/win32/lib/win32/registry.rb, line 496
def self.expand_environ(str)
str.gsub(/%([^%]+)%/) { ENV[$1] || ENV[$1.upcase] || $& }
end
initialize
# File dl/win32/lib/win32/registry.rb, line 564
def initialize(hkey, parent, keyname, disposition)
@hkey = hkey
@parent = parent
@keyname = keyname
@disposition = disposition
@hkeyfinal = [ hkey ]
ObjectSpace.define_finalizer self, @@final.call(@hkeyfinal)
end
constructors
# File dl/win32/lib/win32/registry.rb, line 527
def self.open(hkey, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED)
subkey = subkey.chomp('\')
newkey = API.OpenKey(hkey.hkey, subkey, opt, desired)
obj = new(newkey, hkey, subkey, REG_OPENED_EXISTING_KEY)
if block_given?
begin
yield obj
ensure
obj.close
end
else
obj
end
end
# File dl/win32/lib/win32/registry.rb, line 518
def self.time2wtime(time)
time.to_i * 10000000 + 116444736000000000
end
# File dl/win32/lib/win32/registry.rb, line 691
def [](name, *rtype)
type, data = read(name, *rtype)
case type
when REG_SZ, REG_DWORD, REG_QWORD, REG_MULTI_SZ
data
when REG_EXPAND_SZ
Registry.expand_environ(data)
else
raise TypeError, "Type #{type} is not supported."
end
end
# File dl/win32/lib/win32/registry.rb, line 747
def []=(name, rtype, value = nil)
if value
write name, rtype, value
else
case value = rtype
when Integer
write name, REG_DWORD, value
when String
write name, REG_SZ, value
when Array
write name, REG_MULTI_SZ, value
else
raise TypeError, "Unexpected type #{value.class}"
end
end
value
end
marshalling
# File dl/win32/lib/win32/registry.rb, line 601
def _dump(depth)
raise TypeError, "can't dump Win32::Registry"
end
# File dl/win32/lib/win32/registry.rb, line 616
def close
API.CloseKey(@hkey)
@hkey = @parent = @keyname = nil
@hkeyfinal[0] = nil
end
# File dl/win32/lib/win32/registry.rb, line 612
def create(subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED, &blk)
self.class.create(self, subkey, desired, opt, &blk)
end
attributes
# File dl/win32/lib/win32/registry.rb, line 577
def created?
@disposition == REG_CREATED_NEW_KEY
end
# File dl/win32/lib/win32/registry.rb, line 785
def delete_key(name, recursive = false)
if recursive
open(name, KEY_ALL_ACCESS) do |reg|
reg.keys.each do |key|
begin
reg.delete_key(key, true)
rescue Error
#
end
end
end
API.DeleteKey(@hkey, name)
else
begin
API.EnumKey @hkey, 0
rescue Error
return API.DeleteKey(@hkey, name)
end
raise Error.new(5) ## ERROR_ACCESS_DENIED
end
end
delete
# File dl/win32/lib/win32/registry.rb, line 780
def delete_value(name)
API.DeleteValue(@hkey, name)
end
# File dl/win32/lib/win32/registry.rb, line 645
def each_key
index = 0
while true
begin
subkey, wtime = API.EnumKey(@hkey, index)
rescue Error
break
end
yield subkey, wtime
index += 1
end
index
end
iterator
# File dl/win32/lib/win32/registry.rb, line 625
def each_value
index = 0
while true
begin
subkey = API.EnumValue(@hkey, index)
rescue Error
break
end
begin
type, data = read(subkey)
rescue Error
next
end
yield subkey, type, data
index += 1
end
index
end
flush
# File dl/win32/lib/win32/registry.rb, line 810
def flush
API.FlushKey @hkey
end
key information
# File dl/win32/lib/win32/registry.rb, line 817
def info
API.QueryInfoKey(@hkey)
end
# File dl/win32/lib/win32/registry.rb, line 594
def inspect
"\#<Win32::Registry key=#{name.inspect}>"
end
# File dl/win32/lib/win32/registry.rb, line 659
def keys
keys_ary = []
each_key { |key,| keys_ary << key }
keys_ary
end
# File dl/win32/lib/win32/registry.rb, line 585
def name
parent = self
name = @keyname
while parent = parent.parent
name = parent.keyname + '\' + name
end
name
end
open/close
# File dl/win32/lib/win32/registry.rb, line 608
def open(subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED, &blk)
self.class.open(self, subkey, desired, opt, &blk)
end
# File dl/win32/lib/win32/registry.rb, line 581
def open?
!@hkey.nil?
end
reader
# File dl/win32/lib/win32/registry.rb, line 668
def read(name, *rtype)
type, data = API.QueryValue(@hkey, name)
unless rtype.empty? or rtype.include?(type)
raise TypeError, "Type mismatch (expect #{rtype.inspect} but #{type} present)"
end
case type
when REG_SZ, REG_EXPAND_SZ
[ type, data.chop ]
when REG_MULTI_SZ
[ type, data.split(/\0/) ]
when REG_BINARY
[ type, data ]
when REG_DWORD
[ type, API.unpackdw(data) ]
when REG_DWORD_BIG_ENDIAN
[ type, data.unpack('N')[0] ]
when REG_QWORD
[ type, API.unpackqw(data) ]
else
raise TypeError, "Type #{type} is not supported."
end
end
# File dl/win32/lib/win32/registry.rb, line 720
def read_bin(name)
read(name, REG_BINARY)[1]
end
# File dl/win32/lib/win32/registry.rb, line 716
def read_i(name)
read(name, REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_QWORD)[1]
end
# File dl/win32/lib/win32/registry.rb, line 703
def read_s(name)
read(name, REG_SZ)[1]
end
# File dl/win32/lib/win32/registry.rb, line 707
def read_s_expand(name)
type, data = read(name, REG_SZ, REG_EXPAND_SZ)
if type == REG_EXPAND_SZ
Registry.expand_environ(data)
else
data
end
end
writer
# File dl/win32/lib/win32/registry.rb, line 727
def write(name, type, data)
case type
when REG_SZ, REG_EXPAND_SZ
data = data.to_s + "\00""
when REG_MULTI_SZ
data = data.to_a.join("\00"") + "\00\\00""
when REG_BINARY
data = data.to_s
when REG_DWORD
data = API.packdw(data.to_i)
when REG_DWORD_BIG_ENDIAN
data = [data.to_i].pack('N')
when REG_QWORD
data = API.packqw(data.to_i)
else
raise TypeError, "Unsupported type #{type}"
end
API.SetValue(@hkey, name, type, data, data.length)
end
# File dl/win32/lib/win32/registry.rb, line 773
def write_bin(name, value)
write name, REG_BINARY, value.to_s
end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please see Improve the docs, or visit Documenting-ruby.org.