当前位置: 首页 > 面试题库 >

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

朱通
2023-03-14
问题内容

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



 类似资料:
  • 可以用 Description 特性显示指定枚举值的文本。 namespace MyApplication { public enum Sample { [Description("First Value")] Value1 = 1, [Description("Second Value")] Value2 = 2

  • 我有过 然后 我要集群。a只能是BlahFoo或MooFoo 我该如何执行?

  • Go语言中是否有枚举的简单实现?像下面这样的东西?

  • 问题内容: 我试图代表一个简化的染色体,该染色体由N个碱基组成,每个碱基只能是的一个。 我想用一个枚举形式化约束,但是我想知道在Go语言中最惯用的枚举方式是什么。 问题答案: 引用语言规范:Iota 在常量声明中,预声明的标识符iota表示连续的无类型整数常量。每当保留字const出现在源中时,它将重置为0,并在每个ConstSpec之后递增。它可以用来构造一组相关的常量: 在Expression

  • 问题内容: 我主要是C#开发人员,但目前正在使用Python开发项目。 如何用Python表示等效的枚举? 问题答案: 如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到3.3、3.2、3.1、2.7、2.6、2.5和2.4。 对于更高级的Enum技术,请尝试aenum库(2.7、3.3+,与作者相同。py2和py3之间的代码并不完全兼容,例如,您需要__or

  • 我正在使用Spring 4.0.1,希望使用enum实现一个singleton。我的单例对象需要我在属性文件中定义的服务器名。如何将这个值注入到singleton对象中? 每个服务器名称将有一个单例对象。 请帮忙