Ruby Programming/Standard Library/Win32::Registry

From Wikibooks, open books for an open world
Jump to: navigation, search

The source code itself is also pretty useful.

Contents

[edit] 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"
access = Win32::Registry::KEY_ALL_ACCESS # all access enables you to write, the default access, if you specify none, is KEY_READ (i.e. "just read")
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

<code>
CLASSPATH
1
ComSpec
2
FP_NO_HOST_CHECK
1
HOME
...
</code>

and this example shows you how to look at keys:

<code>
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
</code></pre>
which results in 
<pre>...
Windows
128883664814843750
Windows 3.1 Migration Status
128783367437500000
WinPcap

[edit] Default tutorial

This code is given in the registry.rb file (doesn’t 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>

[edit] 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”

[edit] 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

[edit] 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"!

[edit] Related links

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