使用golang创建进程

时间:2016-02-11 10:04:07

标签: go system-calls

您好我尝试从syscall调用CreateProcess

func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) 

但我收到错误号码123(“文件名,目录名称或卷标语法不正确。”),calc.exe的路径是正确的。

package main
import (
        "fmt"
        "syscall"
)

func main() {
    var pS syscall.SecurityAttributes
    var tS syscall.SecurityAttributes
    var iH bool = true
    var cF uint32
    var env uint16
    var cD uint16
    var sI syscall.StartupInfo
    var pI syscall.ProccessInformation
    var err error

    err = syscall.CreateProcess(
        syscall.StringToUTF16Ptr("c:\\windows\\system32\\calc.exe"),
        syscall.StringToUTF16Ptr(""),
        &pS,
        &tS,
        iH,
        cF,
        &env,
        &cD,
        &sI,
        &pI)

        fmt.Printf("Return: %d\n", err)
}

1 个答案:

答案 0 :(得分:3)

您错误地设置了参数lpCurrentDirectory(来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx):

  

进程当前目录的完整路径。字符串可以   还指定UNC路径。       如果此参数为NULL,则新进程将具有与调用进程相同的当前驱动器和目录。 (此功能是   主要为需要启动应用程序的shell提供   指定其初始驱动器和工作目录。)

如果你把它弄为零,那么它会起作用。 但是,如果要从this获取示例示例,则可以将代码重写为:

package main

import (
    "fmt"
    "syscall"
)

func main() {

    var sI syscall.StartupInfo
    var pI syscall.ProcessInformation

    argv := syscall.StringToUTF16Ptr("c:\\windows\\system32\\calc.exe")

    err := syscall.CreateProcess(
        nil,
        argv,
        nil,
        nil,
        true,
        0,
        nil,
        nil,
        &sI,
        &pI)

    fmt.Printf("Return: %d\n", err)
}