为了账号安全,请及时绑定邮箱和手机立即绑定

如何在registry.GetValue中使用[]byte作为缓冲区?

如何在registry.GetValue中使用[]byte作为缓冲区?

Go
蝴蝶刀刀 2023-07-31 17:28:54
注册表包中的文档GetValue()说:GetValue 检索与打开密钥 k 关联的指定值的类型和数据。它填充缓冲区 buf并返回检索到的字节数 n。如果 buf 太小而无法容纳存储的值,则会返回 ErrShortBuffer 错误以及所需的缓冲区大小 n。如果未提供缓冲区,则返回 true 和实际缓冲区大小 n。如果未提供缓冲区,则 GetValue 仅返回值的类型。如果该值不存在,则返回错误ErrNotExist。GetValue 是一个低级函数。如果值的类型已知,请改用适当的 Get*Value 函数。”就我而言,我不知道注册表项的值类型。但是,我只需要将值打印为字符串。GetValue()接受值名称和“缓冲区”,但缓冲区的类型为 []byte。它不是通过引用传递的,所以我不能只是创建var buf []byte、传递它并读取它。我无法用&buf(type *[]byte)传递它。我无法使用byte.Buffer(也类型不匹配)。我觉得我缺少一些非常简单的东西。代码:var buf []byte //????_, _, e := myKey.GetValue(valuename, buf)if e != nil {    panic(e)}fmt.Printf("Value: %s\n", string(buf)) // Prints blank
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

我想你提到的注册表API是Windows注册表。要使用这些类型的 API,您必须对您期望的调用输出大小做出最佳猜测:


buf:=make([]byte,1024)

typ, n, e := myKey.GetValue(valuename, buf)

if e==ErrShortBuffer {

   // Go back, try with a larger buffer size

   buf=make([]byte,n)

   typ, n, e = myKey.GetValue(valuename, buf)

}


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信