Hi,
I’d like to be able to search a named hive for keys whose names match
a given regular expression.
I found, for example:
require ‘win32/registry’
Win32::Registry::HKEY_CURRENT_USER.open(‘SOFTWARE\AdwareAlert
\AdwareAlert\RegInfo’) do |reg|
puts reg[‘OrderNo’]
end
which let me specify a specific key in the HKCU hive and print the
value of one of its entries.
I don’t actually know why the foregoing is even syntactically correct
because
http://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Registry/Constants.html
says HKEY_CURRENT_USER is a constant in Win32::Registry. Therefore,
it seems to me that HKEY_CURRENT_USER can’t have a method “open”.
Any ideas?
TIA,
Richard
On 06.06.2007 07:13, Richard wrote:
puts reg[‘OrderNo’]
end
which let me specify a specific key in the HKCU hive and print the
value of one of its entries.
I don’t actually know why the foregoing is even syntactically correct
because http://www.ruby-doc.org/stdlib/libdoc/Win32API/rdoc/classes/Win32/Registry/Constants.html
says HKEY_CURRENT_USER is a constant in Win32::Registry.
Why do you think this should disallow the syntax above? It’s perfectly
valid Ruby code. And that does not have to do anything with the fact
that HKEY_CURRENT_USER is a constant.
Therefore,
it seems to me that HKEY_CURRENT_USER can’t have a method “open”.
The documentation is probably a bit misleading:
11:06:11 [~]: ruby -r win32/registry -e
‘k=Win32::Registry::HKEY_CURRENT_USER; p k, k.class,
k.instance_variables.map {|v| “#{v}=#{k.instan
ce_variable_get v}”}’
#<Win32::Registry key=“HKEY_CURRENT_USER”>
Win32::Registry
[“@keyname=HKEY_CURRENT_USER”, “@parent=”, “@hkey=2147483649”,
“@disposition=2”]
Does that fix your irritation?
Btw, if you do this you’ll see some methods that might actually do what
you need (find for example).
ruby -r win32/registry -e ‘puts Win32::Registry.instance_methods.sort’
Kind regards
robert
Hi Robert,
Thanks for your response. I’m studying the issue and will respond
with either “Eureka” or a (hopefully) more sophisticated or nuanced
question.
Best wishes,
Richard
On 07/06/07, Richard [email protected]
wrote:
Hi Robert,
Thanks for your response. I’m studying the issue and will respond
with either “Eureka” or a (hopefully) more sophisticated or nuanced
question.
Hello,
I believe that ‘key’ in registry is that thing that would correspond
to directory, and things that actually contain something (like file)
are called ‘value’. There should be functions to list subkeys and
values of a given key (at least once you open it). Unfortunately,
ruby-doc.org fails to index the win32 stuff properly so your best
source of information is the ri/extension sources shipped with your
Windows build of ruby.
Trying something like (Win32::Registry::HKEY_CURRENT_USER.methods -
methods).sort or (Win32::Registry::HKEY_CURRENT_USER.methods.open(“”)
- methods).sort in irb may give you some idea.
Thanks
Michal
Hi Robert and Michal,
Thanks for your responses.
- I was hung up the the fact that HKEY_CURRENT_USER appears to be a
constant to me. Heretofore, I never heard of a constant having
methods.
CODE START
require ‘win32/registry’
require ‘show’
show %@Win32::Registry::HKEY_CURRENT_USER.class@
CODE END
OUTPUT START
Win32::Registry::HKEY_CURRENT_USER.class
=> Win32::Registry
OUTPUT END
So I now see that this HKEY_CURRENT_USER is an instance of the
Win32::Registry class. OK, this is step 1 of my education.
I’ve visited the http://www.ruby-doc.org/ for the Win32:Registry
module
as well as the Microsoft site for the Registry API. These two things,
plus the fact that I handled the Registry programatically with VC++/
MFC a decade earlier, means I should be fine now.
I am curious about one thing: I haven’t been able to see how the above
construct really works, i.e. where’s the code for it? Maybe I didn’t
read the RDoc carefully enough. From Robert’s inspection statement,
it looks like the expression returns an instance of of Win32::Registry
with an instance variable @key set to HKEY_CURRENT_USER.
Again, thanks for your responses. I did look at the totality of
instance methods, though the Ruby-doc stuff is really what I needed to
look at.
Best wishes,
Richard
P.S. The Microsoft site is
Registry Functions - Win32 apps | Microsoft Learn.
In Ruby, “constant” means that it’s value should not change (that’s
actually just a syntactical convention - you’ll only get a value if
you try A=8; A=9). It also means that it will be stored in a different
table (or at least treated like it was, with different methods to
access it etc’ - I’m not familiar enough with the MRI to comment).
Constants are still Ruby variables, which means that they can store a
reference to any Ruby object.
E.g.:
ERROR_STREAM = File.open(“log.txt”)
If you’re interested in great uses of constants (and class methods
that behave like it was just a constant) try learning how to use
_why’s ingenious Camping. It is full of amazing uses for those. It’s
an afternoon to learn, especially if you’re familiar with Rails.
Aur
Constants are still Ruby variables, which means that they can store a
reference to any Ruby object.
Of course! You’ve eased my brain-cramp Thanks.
try learning how to use
_why’s ingenious Camping
I peeked at “Camping, a Microframework”. Lot’s of interesting stuff.
I put it on my TODO list. Thanks.
Best wishes
Richard