通过Go写入Windows注册表
我需要通过Go写入Windows注册表,但找不到写入机制 我发现它在advapi32.go文件中提供对注册表的只读访问。我已经提交了一份bug报告,要求能够写入注册表,这样它就可以成为未来某个人的愿望列表或任务列表 我认为这种能力甚至可能不存在于现有的Go库中,需要创建它。有可能它已经存在了,我在这里问。如果它不存在,但您对增强go winapi或其他类似库感兴趣,请这样做。或者,如果您知道写入注册表背后的机制,共享这些信息,以便我(或其他人)能够将这些信息写入go winapi库的补丁中,您一定会非常感激 如果没有其他问题,如果我自己能够将其添加到go winapi或类似的库中,我将回到这里回答这个问题(如果没有其他人回答)通过Go写入Windows注册表,windows,winapi,registry,go,Windows,Winapi,Registry,Go,我需要通过Go写入Windows注册表,但找不到写入机制 我发现它在advapi32.go文件中提供对注册表的只读访问。我已经提交了一份bug报告,要求能够写入注册表,这样它就可以成为未来某个人的愿望列表或任务列表 我认为这种能力甚至可能不存在于现有的Go库中,需要创建它。有可能它已经存在了,我在这里问。如果它不存在,但您对增强go winapi或其他类似库感兴趣,请这样做。或者,如果您知道写入注册表背后的机制,共享这些信息,以便我(或其他人)能够将这些信息写入go winapi库的补丁中,您一
另一个选项是使用WMI读取/写入注册表,该注册表也可以通过Go访问 描述如何在Windows中通过WMIC命令行工具执行此操作。可以在任何可以与WMI接口的编程环境中使用 我将用户1391070的答案保留为带标记的答案,但这可能有助于需要执行WMI路径的用户。在找到时,还有可用的Windows注册表代码以及(额外的!)Windows服务管理代码。下面是该代码的示例:
var regSetKeyValueExProc = advapi.MustFindProc("RegSetValueExW")
func regSetKeyValue(h syscall.Handle, keyName string, data interface{}) error {
var dataPtr, dataLen, dataType uintptr
switch v := data.(type) {
case uint32:
dataPtr, dataLen = uintptr(unsafe.Pointer(&v)), 4
dataType = _REG_DWORD
case string:
// The comment on MSDN regarding escaping back-slashes, are c-lang specific.
// The API just takes a normal NUL terminated string, no special escaping required.
dataPtr, dataLen = StringToUTF16PtrLen(v)
dataType = _REG_SZ
}
r0, _, e1 := regSetKeyValueExProc.Call(
uintptr(h),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(keyName))),
0,
dataType,
dataPtr,
dataLen,
)
if r0 != 0 {
return e1
}
return nil
}
这很有用,谢谢。我会检查代码。如果有用的话,我会把这个作为答案。然后我将为go winapi制作一个补丁,以从中获益。再次感谢。事实证明,这段代码只是有一点帮助,在其他方面非常不完整。我为这个问题添加了一个答案,该答案链接到一些用于此目的的好代码。很抱歉删除您答案上的应答标志。