github.com/jmigpin/editor@v1.6.0/util/osutil/misc_windows.go (about) 1 //go:build windows 2 3 package osutil 4 5 import ( 6 "fmt" 7 "os/exec" 8 "syscall" 9 10 "golang.org/x/sys/windows" 11 ) 12 13 //---------- 14 15 const EscapeRune = '^' 16 17 //---------- 18 19 func SetupExecCmdSysProcAttr(cmd *exec.Cmd) { 20 cmd.SysProcAttr = &windows.SysProcAttr{ 21 HideWindow: true, 22 CreationFlags: 0x08000000, // CREATE_NO_WINDOW 23 } 24 } 25 26 func KillExecCmd(cmd *exec.Cmd) error { 27 if cmd.Process == nil { 28 return fmt.Errorf("process is nil") 29 } 30 return cmd.Process.Kill() 31 32 // TODO: child/groups processes? 33 //pid := fmt.Sprintf("%v", cmd.Process.Pid) 34 //c := exec.Command("taskkill", "/T", "/F", "/PID", pid) 35 //return c.Run() 36 } 37 38 //---------- 39 40 func ShellRunArgs(args ...string) []string { 41 return append([]string{"cmd", "/C"}, args...) 42 } 43 44 //---------- 45 46 func ExecName(name string) string { 47 return name + ".exe" 48 } 49 50 //---------- 51 52 func FsCaseFilename(filename string) (string, error) { 53 namep, err := syscall.UTF16PtrFromString(filename) 54 if err != nil { 55 return "", err 56 } 57 58 // Short paths can be longer than long paths, and unicode 59 buf := make([]uint16, 4*len(filename)) 60 bufLen := len(buf) * 2 // in bytes 61 62 short := buf 63 n, err := syscall.GetShortPathName(namep, &short[0], uint32(bufLen)) 64 if err != nil { 65 return "", err 66 } 67 if int(n) > bufLen { 68 return "", fmt.Errorf("short buffer too short: %v vs %v", n, bufLen) 69 } 70 71 long := make([]uint16, len(buf)) 72 n, err = syscall.GetLongPathName(&short[0], &long[0], uint32(bufLen)) 73 if err != nil { 74 return "", err 75 } 76 if int(n) > bufLen { 77 return "", fmt.Errorf("long buffer too short: %v vs %v", n, bufLen) 78 } 79 80 longStr := syscall.UTF16ToString(long) 81 return longStr, nil 82 }