在Go中枚举registry值(Golang)

我试图枚举在Windowsregistry中使用Go的值的列表,但我遇到了一些麻烦。 我已经尝试了两种方法:使用Go提供的syscall库调用RegEnumValue ,以及使用 RegEnumValue 使用Windows API包装器 。 在这两种情况下,我都有同样的问题。 这是我使用的代码(目前使用lxn的win库):

 var root win.HKEY rootpath, _ := syscall.UTF16PtrFromString("HARDWARE\\DEVICEMAP\\SERIALCOMM") fmt.Println(win.RegOpenKeyEx(win.HKEY_LOCAL_MACHINE, rootpath, 0, win.KEY_READ, &root)) var name_length uint32 = 72 var name *uint16 var key_type uint32 var lpData *byte var lpDataLength uint32 = 72 var zero_uint uint32 = 0 fmt.Println(win.RegEnumValue(root, zero_uint, name, &name_length, nil, &key_type, lpData, &lpDataLength)) win.RegCloseKey(root) 

在这种情况下, RegEnumValue总是返回代码87, MSDN唯一的解释是“参数不正确”。

有没有人有任何想法,可以指出我在这个正确的方向吗?

Solutions Collecting From Web of "在Go中枚举registry值(Golang)"

Golang子reddit成员指出,我实际上没有分配任何内存到传递给RegEnumValue的缓冲区。 因此,我已经将上面的示例更正为以下内容:

 var name_length uint32 = 72 var key_type uint32 var lpDataLength uint32 = 72 var zero_uint uint32 = 0 name := make([]uint16, 72) lpData := make([]byte, 72) win.RegEnumValue(root, zero_uint, &name[0], &name_length, nil, &key_type, &lpData[0], &lpDataLength) 

显然,72的“幻数”应该换成别的东西。 还有另一种称为RegQueryInfoKey方法,它可以检索有关注册表项的信息,为密钥中最大的名称和值分配正确的字节数。

也许有人觉得这很有用:

 const regKey = `SOFTWARE\Microsoft\Windows NT\CurrentVersion` func getSettingsFromRegistry() (settings map[string]string) { settings = make(map[string]string) k, err := registry.OpenKey(registry.LOCAL_MACHINE, regKey, registry.QUERY_VALUE) if err != nil { self.Log.Println("Can't open registry key " + regKey , err) return } defer k.Close() params, err := k.ReadValueNames(0) if err != nil { self.Log.Printf("Can't ReadSubKeyNames %s %#v", psaConfRegistry32, err) return } for _, param := range params { val, err := getRegistryValueAsString(k, param) if err != nil { self.Log.Println(err) return } settings[param] = val } self.Log.Printf("%#v\n", settings) return } func getRegistryValueAsString(key registry.Key, subKey string) (string, error) { valString, _, err := key.GetStringValue(subKey) if err == nil { return valString, nil } valStrings, _, err := key.GetStringsValue(subKey) if err == nil { return strings.Join(valStrings, "\n"), nil } valBinary, _, err := key.GetBinaryValue(subKey) if err == nil { return string(valBinary), nil } valInteger, _, err := key.GetIntegerValue(subKey) if err == nil { return strconv.FormatUint(valInteger, 10), nil } return "", errors.New("Can't get type for sub key " + subKey) } 

REG_BINARY值将看起来像“\ x01 \ x00 \ x00 …”