[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

traverse windows registry

Shea Martin

3/21/2007 1:40:00 AM

Is there an example of traversing the window registry? I can't seem to
find any documentation on Win32::Registry. The ruby install came with
some docs for Windows::Registry, but that seems to be a different animal...

THanks,
~S
3 Answers

Shea Martin

3/21/2007 4:51:00 PM

0

Shea Martin wrote:
> Is there an example of traversing the window registry? I can't seem to
> find any documentation on Win32::Registry. The ruby install came with
> some docs for Windows::Registry, but that seems to be a different animal...
>
> THanks,
> ~S


I have traversal code working. Just simple recursion. But I am having
trouble looping over values. An exception is thrown whenever a value of
type REG_NONE is found. This prevents me from iterating over other
values, due to the exception. Even if I rescue the exception, I am
still kicked out of the each_value loop.

The problem is that each_value does a read, and read throws the
exception if the type is REG_NONE. see win32/registry.rb line 633.

Is there anyway around this?

Thanks,
~S

Jeremy Wells

3/21/2007 9:56:00 PM

0

From looking at the source the read bit should already be in a
begin/rescue so it might be worth checking you have the latest version
of ruby and the win32 stuff? I think that the problem is actually in the
read method of registry.rb, doesn't seem to handle REG_NONE. You could
change this method to make it work. Here's the original:

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


Shea Martin wrote:
> Shea Martin wrote:
>> Is there an example of traversing the window registry? I can't seem
>> to find any documentation on Win32::Registry. The ruby install came
>> with some docs for Windows::Registry, but that seems to be a
>> different animal...
>>
>> THanks,
>> ~S
>
>
> I have traversal code working. Just simple recursion. But I am having
> trouble looping over values. An exception is thrown whenever a value
> of type REG_NONE is found. This prevents me from iterating over other
> values, due to the exception. Even if I rescue the exception, I am
> still kicked out of the each_value loop.
>
> The problem is that each_value does a read, and read throws the
> exception if the type is REG_NONE. see win32/registry.rb line 633.
>
> Is there anyway around this?
>
> Thanks,
> ~S
>

Shea Martin

3/22/2007 12:03:00 AM

0

Yeah,

I notices that it would be dead simple to make it work. Just add
TypeError to the rescue clause. But I like to write portable code that
doesn't depend on changing standard libs.

I would say that this is a design flaw though, of the win32/registry.rb
code. It makes it unusable for iteration, as it is inevitable that one
will come across a REG_NONE at some point.

I ended up just copying the each_value function, and making my own
global version with took a registry entry as a parameter.

~S

Jeremy wrote:
> From looking at the source the read bit should already be in a
> begin/rescue so it might be worth checking you have the latest version
> of ruby and the win32 stuff? I think that the problem is actually in the
> read method of registry.rb, doesn't seem to handle REG_NONE. You could
> change this method to make it work. Here's the original:
>
> 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
>
>
> Shea Martin wrote:
>> Shea Martin wrote:
>>> Is there an example of traversing the window registry? I can't seem
>>> to find any documentation on Win32::Registry. The ruby install came
>>> with some docs for Windows::Registry, but that seems to be a
>>> different animal...
>>>
>>> THanks,
>>> ~S
>>
>>
>> I have traversal code working. Just simple recursion. But I am having
>> trouble looping over values. An exception is thrown whenever a value
>> of type REG_NONE is found. This prevents me from iterating over other
>> values, due to the exception. Even if I rescue the exception, I am
>> still kicked out of the each_value loop.
>>
>> The problem is that each_value does a read, and read throws the
>> exception if the type is REG_NONE. see win32/registry.rb line 633.
>>
>> Is there anyway around this?
>>
>> Thanks,
>> ~S
>>
>