【问题标题】:CreateProcess with golang使用 golang 创建流程
【发布时间】:2016-05-22 00:57:56
【问题描述】:

您好,我正在尝试从系统调用调用 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)
}

【问题讨论】:

  • 有什么理由不使用 Go 的高级抽象吗?即os/exec 包? golang.org/pkg/os/exec
  • 进程创建后我想用指向 pI(processInformation) 的指针来写内存

标签: go system-calls


【解决方案1】:

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

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

如果你把它设为 nil,那么它会起作用。 但是,如果以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)
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多