在Go(Golang)中枚举注册表值

我正在尝试使用Go枚举Windows注册表中的值列表,但遇到了一些麻烦。我尝试了两种方法:使用Go提供的syscall库进行调用RegEnumValue,以及使用lxn的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唯一的解释是“参数不正确”。

有没有人有任何想法可以为此指出正确的方向?

回答:

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,可以检索有关注册表项的信息,以便为项中最大的名称和值分配正确的字节数。

以上是 在Go(Golang)中枚举注册表值 的全部内容, 来源链接: utcz.com/qa/404398.html

回到顶部