winregでREG_QWORDを無理やり読み書きする方法
今のところPythonのwinregはREG_QWORDに対応していない。しかしwinregのソースを見てみたところ、未知のデータ型はバイナリ扱いにするようなので、整数をバイナリに変換すれば読み書きできることに気がついた。
具体的にはwinreg.SetValueEx()を呼ぶ前にデータをstruct.packしておく
#! python3.2 import winreg import struct with winreg.CreateKeyEx(winreg.HKEY_CURRENT_USER, r'Software\__test__') as key: data = 12345678901234567890 if hasattr(winreg, 'REG_QWORD'): regtype = winreg.REG_QWORD else: # REG_QWORD未対応の場合 regtype = 11 data = struct.pack('Q', data) winreg.SetValueEx(key, 'quadValue', 0, regtype, data)
また、winreg.QueryValueEx()を呼んだ後にデータをstruct.unpackする
import winreg import struct REG_QWORD = 11 with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\__test__') as key: data, regtype = winreg.QueryValueEx(key, 'quadValue') if not hasattr(winreg, 'REG_QWORD') and regtype == REG_QWORD: # REG_QWORD未対応の場合 data = struct.unpack('Q', data)[0] print(data)
という方法でうまくいく。
そもそもwinregはREG_BINARYの処理をswitch文のdefaultにフォールスルーしているので、元からこういう風に書くことを狙っているのではないかという気がしてきた。