Python 2.6 - I can not write dwords greater than 0x7fffffff into registry using _winreg.SetValueEx()
using regedit.exe I have manually created a key in registry called
HKEY_CURRENT_USER/00_Just_a_Test_Key and created two dword values dword_test_1 and dword_test_2 I am trying to write some values into those two keys using following programimport _winreg
aReg = _winreg.ConnectRegistry(None,_winreg.HKEY_CURRENT_USER)
aKey = _winreg.OpenKey(aReg, r"00_Just_a_Test_Key", 0, _winreg.KEY_WRITE)
_winreg.SetValueEx(aKey,"dword_test_1",0, _winreg.REG_DWORD, 0x0edcba98)
_winreg.SetValueEx(aKey,"dword_test_2",0, _winreg.REG_DWORD, 0xfedcba98)
_winreg.CloseKey(aKey)
_winreg.CloseKey(aReg)
I can write into the first key, dword_test_1, but when I attempt to write into the second, I get following message
Traceback (most recent call last):
File "D:/src/registry/question.py", line 7, in <module>
_winreg.SetValueEx(aKey,"dword_test_2",0, _winreg.REG_DWORD, 0xfedcba98)
ValueError: Could not convert the data to the specified type.
How do I write the second value 0xfedcba98, or any value greater than 0x7fffffff
as a dword value? Originally I was writing script to switch the "My documents" icon on or off by writing "0xf050开发者_StackOverflow社区0174" to hide or "0xf0400174" to display the icon into [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID{450D8FBA-AD25-11D0-98A8-0800361B1103}\ShellFolder]Most likely the function expects an int
within the limits of a signed C integer, so you'll need to subtract 0x100000000
before passing to the function.
Yes, ideally this would be solved in the bindings. Unfortunately someone let this one slide.
I have solved the problem the following way
import _winreg
def complement(n,radix=32):
if n < (1<<(radix-1)) : return n # n is less than 0x80000000 and we do not do anything
else : return n - (1<<radix) # n is greater than 0x80000000 and we have to convert it
# (1<<31) can be written in binary as 1 followed by 31 zeroes - that is 0x80000000
# n - (1<<radix) is how to get the representation of the number as a signed dword.
# See http://stackoverflow.com/questions/1604464/twos-complement-in-python
# for explanation
aReg = _winreg.ConnectRegistry(None,_winreg.HKEY_CURRENT_USER)
aKey = _winreg.OpenKey(aReg, r"00_Just_a_Test_Key", 0, _winreg.KEY_WRITE)
_winreg.SetValueEx(aKey,"dword_test_1",0, _winreg.REG_DWORD, complement(0x0edcba98))
_winreg.SetValueEx(aKey,"dword_test_2",0, _winreg.REG_DWORD, complement(0xfedcba98))
_winreg.CloseKey(aKey)
_winreg.CloseKey(aReg)
精彩评论