我有启动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进行了检查,这两个文件都不为空
答案 0 :(得分:-1)
问题出在某些电脑上。 Windows出了点问题。重新安装Windows会消除问题。