Win32:Определите, является ли дескриптор стандартного вывода char или потоком wchar

StackOverflow https://stackoverflow.com/questions/632611

  •  08-07-2019
  •  | 
  •  

Вопрос

Я пишу служебную функцию 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 () и основывать на предположениях если он выглядит как символ Юникода ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top