您好我尝试从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)
}
答案 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)
}