Win32:Определите, является ли дескриптор стандартного вывода char или потоком wchar
Вопрос
Я пишу служебную функцию win32 для нашего продукта, которая должна вызывать произвольную программу через оболочку и регистрировать ее выходные данные.Мы делаем это, перенаправляя стандартный вывод из дочернего процесса в канал:
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.
Как я могу определить, записывает ли дочерний процесс в свой канал стандартного вывода как CHAR или WCHAR?
Решение
Суть в том, что не существует 100% надежного способа сделать это.Дескрипторы ввода / вывода процесса не зависят от конкретной кодировки.Они просто оперируют потоком байтов.Вполне возможно, что процесс некоторое время будет записывать ASCII, а позже переключится на Unicode.
К сожалению, по потоку байтов невозможно определить со 100% точностью, какова базовая кодировка.Единственный способ определить это - иметь протокол рукопожатия, в котором процесс сообщает вам, какую кодировку он будет использовать.Скорее всего, это не вариант в данном случае.
Ссылки по теме
Другие советы
Я думаю, что вы должны договориться об этом при подключении. Вы можете использовать PeekNamedPipe () и основывать на предположениях если он выглядит как символ Юникода ...