Skip to content

Commit ad6fa8d

Browse files
committed
signal an environment change in windows to pickup new environment values
1 parent a8353c6 commit ad6fa8d

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

windows_dao.go

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,43 @@
33
package penv
44

55
import (
6-
"log"
76
"runtime"
87
"strings"
8+
"syscall"
9+
"unsafe"
10+
11+
"github.com/lxn/win"
912

1013
"golang.org/x/sys/windows/registry"
1114
)
1215

16+
const (
17+
SMTO_BLOCK uint32 = 0x0001
18+
)
19+
20+
var (
21+
libuser32 *syscall.DLL
22+
sendMessageTimeoutAddr *syscall.Proc
23+
)
24+
25+
func init() {
26+
libuser32 = syscall.MustLoadDLL("user32.dll")
27+
sendMessageTimeoutAddr = libuser32.MustFindProc("SendMessageTimeoutW")
28+
}
29+
30+
func sendMessageTimeout(hWnd win.HWND, msg uint32, wParam, lParam uintptr, fuFlags, uTimeout uint32, lpdwResult uintptr) uintptr {
31+
r1, _, _ := sendMessageTimeoutAddr.Call(
32+
uintptr(hWnd),
33+
uintptr(msg),
34+
wParam,
35+
lParam,
36+
uintptr(fuFlags),
37+
uintptr(uTimeout),
38+
lpdwResult)
39+
40+
return r1
41+
}
42+
1343
// WindowsDAO is the data access object for windows
1444
type WindowsDAO struct {
1545
}
@@ -73,9 +103,12 @@ func (dao *WindowsDAO) Save(env *Environment) error {
73103
return err
74104
}
75105

76-
log.Println(names)
77-
log.Println("SETTERS", env.Setters)
78-
log.Println("APPENDERS", env.Appenders)
106+
for i := range env.Setters {
107+
env.Setters[i].Value = strings.Replace(env.Setters[i].Value, "/", "\\", -1)
108+
}
109+
for i := range env.Appenders {
110+
env.Appenders[i].Value = strings.Replace(env.Appenders[i].Value, "/", "\\", -1)
111+
}
79112

80113
// set
81114
for _, nv := range env.Setters {
@@ -86,6 +119,7 @@ func (dao *WindowsDAO) Save(env *Environment) error {
86119
}
87120

88121
// append
122+
append_loop:
89123
for _, nv := range env.Appenders {
90124
values := []string{}
91125
for _, name := range names {
@@ -95,10 +129,15 @@ func (dao *WindowsDAO) Save(env *Environment) error {
95129
return err
96130
}
97131
values = append(values, strings.Split(value, ";")...)
132+
values = uniquei(append(values, nv.Value))
133+
err = key.SetStringValue(nv.Name, strings.Join(values, ";"))
134+
if err != nil {
135+
return err
136+
}
137+
break append_loop
98138
}
99139
}
100-
values = uniquei(append(values, nv.Value))
101-
err = key.SetStringValue(nv.Name, strings.Join(values, ";"))
140+
err = key.SetStringValue(nv.Name, nv.Value)
102141
if err != nil {
103142
return err
104143
}
@@ -116,5 +155,9 @@ func (dao *WindowsDAO) Save(env *Environment) error {
116155
}
117156
}
118157

158+
str := "Environment"
159+
pstr, _ := syscall.UTF16PtrFromString(str)
160+
sendMessageTimeout(win.HWND_BROADCAST, win.WM_WININICHANGE, 0, uintptr(unsafe.Pointer(pstr)), SMTO_BLOCK, 5000, 0)
161+
119162
return nil
120163
}

0 commit comments

Comments
 (0)