33package penv
44
55import (
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
1444type 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