Ruby Programming/Standard Library/Win32::Registry

The source code itself is also pretty useful.

how to do a simple query (values)

With the win32 registry, keys mean subkey (like a folder), and values mean subentry (like file). This example shows how to look at values:

require 'win32/registry'
keyname= 'SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment'

# KEY_ALL_ACCESS enables you to write and deleted.
# the default access is KEY_READ if you specify nothing
access = Win32::Registry::KEY_ALL_ACCESS

Win32::Registry::HKEY_LOCAL_MACHINE.open(keyname, access) do |reg|
  # each is the same as each_value, because #each_key actually means 
  # "each child folder" so #each doesn't list any child folders...
  # use #keys for that...
  reg.each{|name, value| puts name, value}
end

or

a = Win32::Registry::HKEY_LOCAL_MACHINE.open \
  "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment",  Win32::Registry::KEY_READ
a.each{|n, v| p n, v}
a.close

which results in

CLASSPATH
1
ComSpec
2
FP_NO_HOST_CHECK
1
HOME
...
and this example shows you how to look at keys:
require 'win32/registry'
keyname= "SOFTWARE" # this isn't actually case sensitive, but hey
access = Win32::Registry::KEY_ALL_ACCESS
Win32::Registry::HKEY_LOCAL_MACHINE.open(keyname, access) do |reg|; 
  reg.each_key{|k, v| puts k, v}
end
which results in 
...
Windows
128883664814843750
Windows 3.1 Migration Status
128783367437500000
WinPcap

Default tutorial

This code is given in the registry.rb file (doesnt show up in the normal rdocs for some reason)


<code>
  Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\foo') do |reg|
    value = reg['foo']                               # read a value
    value = reg['foo', Win32::Registry::REG_SZ]      # read a value with type
    type, value = reg.read('foo')                    # read a value
    reg['foo'] = 'bar'                               # write a value
    reg['foo', Win32::Registry::REG_SZ] = 'bar'      # write a value with type
    reg.write('foo', Win32::Registry::REG_SZ, 'bar') # write a value
    reg.each_value { |name, type, data| ... }        # Enumerate values
    reg.each_key { |key, wtime| ... }                # Enumerate subkeys
    reg.delete_value(name)                         # Delete a value
    reg.delete_key(name)                           # Delete a subkey
    reg.delete_key(name, true)                     # Delete a subkey recursively
  end
</code>

Win32::Registry.create

<code>
 Win32::Registry::HKEY_LOCAL_MACHINE.create "software\\abc"
</code>

Note also that you can do nested creates in a single call, like software\\classes\\*\\shell\\abc\\subdir\\subdir

how to write default values:

write default values ("Default" in regedit) by passing nil as the name, ex:

  a.write_s nil, "a default string"
  # and read it back
  a.read_s nil

More complex example

This code adds an option to the context menu with you right click on any file.

name = Win32::Registry::HKEY_LOCAL_MACHINE.create "Software\\classes\\*\\shell\\open_with_arcadia"
name.write_s nil, "play with arcadia"
dir = Win32::Registry::HKEY_LOCAL_MACHINE.create "Software\\classes\\*\\shell\\open_with_arcadia\\command"
dir.write_s nil, %!"#{ruby}" "#{arcadia}" "%1"!

http://rubyforge.org/snippet/detail.php?type=snippet&id=13

This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.