Windows TerminateProcess()返回EINVAL

Windows TerminateProcess()返回EINVAL,windows,go,winapi,Windows,Go,Winapi,我试图调试一个问题,但我不理解它 func BackgroundProcess(lpCommandLine string) (error) { var lpProcessAttrs windows.SecurityAttributes var lpThreadAttrs windows.SecurityAttributes var lpProcInfo windows.ProcessInformation var lpStartup windows.Startup

我试图调试一个问题,但我不理解它

func BackgroundProcess(lpCommandLine string) (error) {
    var lpProcessAttrs windows.SecurityAttributes
    var lpThreadAttrs windows.SecurityAttributes
    var lpProcInfo windows.ProcessInformation
    var lpStartup windows.StartupInformation

    // convert to null terminated
    lpCli, err := StringToLpStr(lpCommandLine)
    if err != nil {
        return err
    }

    if ok := CreateProcess(nil, lpCli, &lpProcessAttrs, &lpThreadAttrs, true, 0, nil, nil, &lpStartup, &lpProcInfo); !ok {
        return GetLastError()
    }
    // DeleteProcessAccessRight is just a const for 1
    childProcessHandle = OpenProcess(DeleteProcessAccessRight, false, lpProcInfo.dwProcess)
    if ok := TerminateProcess(childProcessHandle, 0); !ok {
        return GetLastError()
    }
}

如果我用
BackgroundProcess(“C:\\Windows\\System32\\calc.exe”)
调用它,我会在
TerminateProcess
上得到错误
EINVAL
,它是
无效参数。查看TerminateProcess的MSDN文档,首先需要使用process\u TERMINATE访问权限打开对流程的访问。我正在使用访问权限打开流程,所以它应该可以正常工作。我做错了什么/错过了什么?

所以我解决了这个具体问题。我在用
C:\\Windows\\System32\\calc.exe进行测试,这是一个通用的Windows应用程序,它有一个运行时代理。我一开始用
C:\\Windows\\System32\\notepad.exe测试,它就开始工作了。一旦我弄明白如何处理运行时代理,我将更新这个答案。

所以我解决了这个具体问题。我在用
C:\\Windows\\System32\\calc.exe进行测试,这是一个通用的Windows应用程序,它有一个运行时代理。我一开始用
C:\\Windows\\System32\\notepad.exe测试,它就开始工作了。一旦我弄明白了如何处理运行时代理,我将更新这个答案。

你确定给出上述结果的是最终的
GetLastError
吗?为什么你要在创建进程后立即终止它?当你已经有了进程句柄时,你称之为
OpenProcess
?然后,您没有检查
OpenProcess
的结果-它是否失败,以及(我不知道如何)是否从调用
TerminateProcess
或调用
OpenProcess
返回错误?我想是第二个。您从映射到
错误\u无效\u参数的
OpenProcess
获得了
状态\u无效\u CID
TerminateProcess
您甚至没有调用
EINVAL
?请不要将C/POSIX错误代码与Windows API调用混淆。在这种情况下谈论
EINVAL
毫无意义。你确定给出上述结果的是最终的
GetLastError
?为什么你要在创建进程后立即终止它?当你已经有了进程句柄时,你称之为
OpenProcess
?然后,您没有检查
OpenProcess
的结果-它是否失败,以及(我不知道如何)是否从调用
TerminateProcess
或调用
OpenProcess
返回错误?我想是第二个。您从映射到
错误\u无效\u参数的
OpenProcess
获得了
状态\u无效\u CID
TerminateProcess
您甚至没有调用
EINVAL
?请不要将C/POSIX错误代码与Windows API调用混淆。在这种情况下谈论
EINVAL
毫无意义。