2

regedit.exeを使用して、
HKEY_CURRENT_USER / 00_Just_a_Test_Keyという名前のキーをレジストリに手動で作成し、
2つのdword値
dword_test_1とdword_test_2
を作成しました。次のプログラムを使用して、これら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に書き込めますが、2番目のキーに書き込もうとすると、次のメッセージが表示されます。

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.

2番目の値0xfedcba98、または0x7fffffffより大きい値
をdword値として書き込むにはどうすればよいですか?

もともと私は、アイコンを[HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ CLSID {450D8FBA-AD25 -11D0-98A8-0800361B1103} \ ShellFolder]

4

2 に答える 2

3

ほとんどの場合、関数はint符号付き C 整数の範囲内で を想定している0x100000000ため、関数に渡す前に減算する必要があります。

はい、理想的には、これはバインディングで解決されます。残念ながら、誰かがこれをスライドさせました。

于 2010-03-04T17:13:22.777 に答える
1

私は次の方法で問題を解決しました

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)
于 2010-03-05T12:33:43.603 に答える