我正在为我们的产品编写一个Win32实用程序函数,需要通过Shell调用任意程序并记录其输出。我们通过将子进程的标准输出重定向到管道来实现这一点:
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0);
// Redirect the first process stdout to our write pipe
// so that we can read its output from the read pipe.
startUpInfo.dwFlags = STARTF_USESTDHANDLES;
startUpInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startUpInfo.hStdOutput = hWritePipe;
startUpInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
CreateProcessA(NULL, szCmdLine, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startUpInfo[i], &procInfo);
有许多程序可能被称为这种方式,其中许多程序不在我们的控制范围内。目前我们遇到的问题是,许多程序的输出似乎在第一个字符之后被截断 —— 这通常是错误地使用了WCHAR字符串作为CHAR的明确迹象。
我如何确定子进程是将其stdout管道写入为CHAR还是WCHAR?