2016-02-11 72 views
4

你好,我嘗試從系統調用的CreateProcess與golang

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

調用CreateProcess的,但我得到了錯誤NUM 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) 
} 
+2

有你爲什麼不使用Go的更高層次的抽象的原因嗎?即'os/exec'包? https://golang.org/pkg/os/exec/ –

+0

創建過程後,我想用指針到pI(processInformation)來寫內存 –

回答

2

你正確設置參數lpCurrentDirectory(從https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx):

的完整路徑的過程中的當前目錄。字符串可以 也指定一個UNC路徑。 如果此參數爲NULL,則新進程將具有與調用進程相同的當前驅動器和目錄。 (此功能主要是爲那些需要啓動一個應用程序,並 指定它的初始驅動器和工作目錄殼提供 。)

如果你讓零,那麼它會工作。 但是,如果採取從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) 
}