2010-03-04 18 views
2

utilisant regedit.exe J'ai créé manuellement une clé dans le registre appelé
HKEY_CURRENT_USER/00_Just_a_Test_Key
et créé deux valeurs dword
dword_test_1 et dword_test_2
Je suis en train d'écrire des valeurs dans ces deux touches en utilisant le programme suivantPython 2.6 - Je ne peux pas écrire dans registre dwords supérieur à l'aide 0x7fffffff _winreg.SetValueEx()

import _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) 

Je peux écrire dans la première clé, dword_test_1, mais lorsque je tente d'écrire dans le deuxième, je me le message suivant

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. 

Comment puis-je écrire la deuxième valeur 0xfedcba98, ou toute valeur supérieure à 0x7fffffff
en tant que valeur de dword?

Au départ, j'été l'écriture de script pour changer le « Mes documents » icône ou désactiver en écrivant « 0xf0500174 » pour cacher ou « 0xf0400174 » pour afficher l'icône dans [HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ CLSID {450D8FBA-AD25-11D0-98A8-0800361B1103} \ ShellFolder]

+2

Vous devez déposer un bug. Cet appel d'API doit accepter des valeurs comprises entre [-2147483648,4294967295]. Les valeurs DWORD du registre sont des entiers 32 bits non signés et l'acceptation de valeurs négatives l'empêchera de casser le code existant. http://bugs.python.org/ –

Répondre

3

Très probablement la fonction attend un int dans les limites d'un entier signé C, de sorte que vous devrez soustraire 0x100000000 avant de passer à la fonction. Oui, idéalement, cela serait résolu dans les fixations. Malheureusement quelqu'un a laissé glisser celui-ci.

1

J'ai résolu le problème de la manière suivante

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)