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

时间:2013-08-25 03:43:55

标签: windows go

我正在尝试使用Go枚举Windows注册表中的值列表,但是我遇到了一些麻烦。我尝试了两种方法:使用Go提供的syscall库来调用RegEnumValue以及using a Windows API wrapper by lxn。在这两种情况下,我都有同样的问题。这是我正在使用的代码(目前正在使用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's only explanation为“参数不正确。”

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

也许有人发现这很有用:

{{1}}

REG_BINARY值看起来像“\ x01 \ x00 \ x00 ...”

相关问题