106 lines
2.0 KiB
Go
106 lines
2.0 KiB
Go
|
// Copyright 2010 The Walk Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// +build windows
|
||
|
|
||
|
package walk
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
import (
|
||
|
"github.com/lxn/win"
|
||
|
)
|
||
|
|
||
|
type RegistryKey struct {
|
||
|
hKey win.HKEY
|
||
|
}
|
||
|
|
||
|
func ClassesRootKey() *RegistryKey {
|
||
|
return &RegistryKey{win.HKEY_CLASSES_ROOT}
|
||
|
}
|
||
|
|
||
|
func CurrentUserKey() *RegistryKey {
|
||
|
return &RegistryKey{win.HKEY_CURRENT_USER}
|
||
|
}
|
||
|
|
||
|
func LocalMachineKey() *RegistryKey {
|
||
|
return &RegistryKey{win.HKEY_LOCAL_MACHINE}
|
||
|
}
|
||
|
|
||
|
func RegistryKeyString(rootKey *RegistryKey, subKeyPath, valueName string) (value string, err error) {
|
||
|
var hKey win.HKEY
|
||
|
if win.RegOpenKeyEx(
|
||
|
rootKey.hKey,
|
||
|
syscall.StringToUTF16Ptr(subKeyPath),
|
||
|
0,
|
||
|
win.KEY_READ,
|
||
|
&hKey) != win.ERROR_SUCCESS {
|
||
|
|
||
|
return "", newError("RegistryKeyString: Failed to open subkey.")
|
||
|
}
|
||
|
defer win.RegCloseKey(hKey)
|
||
|
|
||
|
var typ uint32
|
||
|
var data []uint16
|
||
|
var bufSize uint32
|
||
|
|
||
|
if win.ERROR_SUCCESS != win.RegQueryValueEx(
|
||
|
hKey,
|
||
|
syscall.StringToUTF16Ptr(valueName),
|
||
|
nil,
|
||
|
&typ,
|
||
|
nil,
|
||
|
&bufSize) {
|
||
|
|
||
|
return "", newError("RegQueryValueEx #1")
|
||
|
}
|
||
|
|
||
|
data = make([]uint16, bufSize/2+1)
|
||
|
|
||
|
if win.ERROR_SUCCESS != win.RegQueryValueEx(
|
||
|
hKey,
|
||
|
syscall.StringToUTF16Ptr(valueName),
|
||
|
nil,
|
||
|
&typ,
|
||
|
(*byte)(unsafe.Pointer(&data[0])),
|
||
|
&bufSize) {
|
||
|
|
||
|
return "", newError("RegQueryValueEx #2")
|
||
|
}
|
||
|
|
||
|
return syscall.UTF16ToString(data), nil
|
||
|
}
|
||
|
|
||
|
func RegistryKeyUint32(rootKey *RegistryKey, subKeyPath, valueName string) (value uint32, err error) {
|
||
|
var hKey win.HKEY
|
||
|
if win.RegOpenKeyEx(
|
||
|
rootKey.hKey,
|
||
|
syscall.StringToUTF16Ptr(subKeyPath),
|
||
|
0,
|
||
|
win.KEY_READ,
|
||
|
&hKey) != win.ERROR_SUCCESS {
|
||
|
|
||
|
return 0, newError("RegistryKeyUint32: Failed to open subkey.")
|
||
|
}
|
||
|
defer win.RegCloseKey(hKey)
|
||
|
|
||
|
bufSize := uint32(4)
|
||
|
|
||
|
if win.ERROR_SUCCESS != win.RegQueryValueEx(
|
||
|
hKey,
|
||
|
syscall.StringToUTF16Ptr(valueName),
|
||
|
nil,
|
||
|
nil,
|
||
|
(*byte)(unsafe.Pointer(&value)),
|
||
|
&bufSize) {
|
||
|
|
||
|
return 0, newError("RegQueryValueEx")
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|