CreateProcessAsUser不会重定向stderr

时间:2018-08-06 11:20:17

标签: c windows winapi

我有启动UI测试的进程(jenkins),所以我需要在GUI上下文中运行它们。 我正在使用CreateProcessAsUser创建进程,它可以正常工作,但不会重定向stderr。 Stdout被重定向,但stderr不被重定向。

STARTUPINFO StartupInfo;
memset(&StartupInfo, 0, sizeof(StartupInfo));

PROCESS_INFORMATION processInfo;
memset(&processInfo, 0, sizeof(processInfo));

StartupInfo.cb = sizeof(STARTUPINFO);

StartupInfo.lpDesktop = (LPSTR)("winsta0\\default");
StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
StartupInfo.wShowWindow = SW_SHOWNORMAL;
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE), GetCurrentProcess(), &StartupInfo.hStdInput,0, TRUE, DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE), GetCurrentProcess(), &StartupInfo.hStdOutput, 0, TRUE, DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_ERROR_HANDLE), GetCurrentProcess(), &StartupInfo.hStdError, 0, TRUE, DUPLICATE_SAME_ACCESS);
//StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
printf("std input %p\n", StartupInfo.hStdInput);
printf("std output %p\n", StartupInfo.hStdOutput);
printf("std error %p\n", StartupInfo.hStdError);

void* lpEnvironment = NULL;

BOOL resultEnv = CreateEnvironmentBlock(&lpEnvironment, hPrimaryToken, FALSE);

if (resultEnv == 0)
{
    long nError = GetLastError();
    printf("cannot create environment block\n");
    return FALSE;
}

fflush(stdout);

BOOL result = CreateProcessAsUser(hPrimaryToken, NULL, (LPSTR)command.c_str(), NULL, NULL, TRUE,

    NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT,

    lpEnvironment, 0, &StartupInfo, &processInfo);

上面是我如何创建过程的代码。我通过的句柄不为NULL。 标准错误不为空。我在不同文件中使用重定向stdout和stderr进行了检查,这两个文件都不为空

1 个答案:

答案 0 :(得分:-1)

问题出在某些电脑上。 Windows出了点问题。重新安装Windows会消除问题。