Python 2.6 - я не могу записать слова dx7fffffff в реестр, используя _winreg.SetValueEx () - PullRequest
2 голосов
/ 04 марта 2010

с помощью regedit.exe Я вручную создал ключ в реестре под названием
HKEY_CURRENT_USER / 00_Just_a_Test_Key
и создал два значения dword
dword_test_1 и dword_test_2
Я пытаюсь записать некоторые значения в эти два ключа, используя следующую программу

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)  

Я могу написать в первый ключ, dword_test_1, но когда я пытаюсь записать во второй, я получаю следующее сообщение

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.

Как мне записать второе значение 0xfedcba98 или любое значение больше 0x7fffffff
в качестве значения dword?

Первоначально я писал сценарий для включения или отключения значка «Мои документы», написав «0xf0500174» для скрытия или «0xf0400174» для отображения значка в [HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ CLSID {450D8FBA-AD25 -11D0-98A8-0800361B1103} \ ShellFolder]

Ответы [ 2 ]

3 голосов
/ 04 марта 2010

Скорее всего, функция ожидает int в пределах целого числа со знаком C, поэтому вам необходимо вычесть 0x100000000 перед переходом к функции.

Да, в идеале это будет решенов привязках.К сожалению, кто-то пропустил это.

1 голос
/ 05 марта 2010

Я решил проблему следующим образом

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 /877003/dva-dopolneniya-v-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)
...