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  }