通过Go写入Windows注册表

通过Go写入Windows注册表,windows,winapi,registry,go,Windows,Winapi,Registry,Go,我需要通过Go写入Windows注册表,但找不到写入机制 我发现它在advapi32.go文件中提供对注册表的只读访问。我已经提交了一份bug报告,要求能够写入注册表,这样它就可以成为未来某个人的愿望列表或任务列表 我认为这种能力甚至可能不存在于现有的Go库中,需要创建它。有可能它已经存在了,我在这里问。如果它不存在,但您对增强go winapi或其他类似库感兴趣,请这样做。或者,如果您知道写入注册表背后的机制,共享这些信息,以便我(或其他人)能够将这些信息写入go winapi库的补丁中,您一

我需要通过Go写入Windows注册表,但找不到写入机制

我发现它在advapi32.go文件中提供对注册表的只读访问。我已经提交了一份bug报告,要求能够写入注册表,这样它就可以成为未来某个人的愿望列表或任务列表

我认为这种能力甚至可能不存在于现有的Go库中,需要创建它。有可能它已经存在了,我在这里问。如果它不存在,但您对增强go winapi或其他类似库感兴趣,请这样做。或者,如果您知道写入注册表背后的机制,共享这些信息,以便我(或其他人)能够将这些信息写入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制作一个补丁,以从中获益。再次感谢。事实证明,这段代码只是有一点帮助,在其他方面非常不完整。我为这个问题添加了一个答案,该答案链接到一些用于此目的的好代码。很抱歉删除您答案上的应答标志。