Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Patron
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 2
#1

Чтение UNICODE символов из STDOUT процесса - C++

12.06.2014, 20:45. Просмотров 652. Ответов 2
Метки нет (Все метки)

У меня есть процесс (cmd.exe) создан через WINAPI функцию CreateProcess. К процессу подключено 2 переменных типа HANDLE из которых в свою очередь созданы пайпы для записи и чтения из процесса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
HANDLE g_hChildStd_IN_Rd = NULL;
// write to pipe
HANDLE g_hChildStd_IN_Wr = NULL;
// read from pipe
HANDLE g_hChildStd_OUT_Rd = NULL;
HANDLE g_hChildStd_OUT_Wr = NULL;
 
...
 
// Create a child process that uses the previously created pipes for STDIN and STDOUT.
 
bool createCmdSubProcess()
{  
    SECURITY_ATTRIBUTES saAttr; 
   // Set the bInheritHandle flag so pipe handles are inherited.  
   saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
   saAttr.bInheritHandle = TRUE; 
   saAttr.lpSecurityDescriptor = NULL; 
 
   // Create a pipe for the child process's STDOUT. 
   CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0);
   SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0);
 
   // Create a pipe for the child process's STDIN. 
   CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0);
   SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0);
 
... 
 
// кусок кода который читает из процесса
 
        DWORD dwRead; 
    char chBuf[1000];  // пробовал wchar_t chBuf[1000]; , TCHAR chBuf[1000];, WORD chBuf[1000];, DWORD chBuf[1000];, BYTE chBuf[1000];
    BOOL bSuccess = FALSE;
    // Read output from the child process's pipe for STDOUT
    // Stop when there is no more data.    
    for (;;) 
    { 
        bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, 1000, &dwRead, NULL);
        if( ! bSuccess || dwRead == 0 ) { 
            break;
        }
    }
Весь код в принципе рабочий но проблема в том что буквы отличные от английских записываются в буфер с непонятными значениями и при выводе получаются иероглифы.

Скриншот контента буфера сделан в дебагере:
Чтение UNICODE символов из STDOUT процесса
а должно быть такое
Чтение UNICODE символов из STDOUT процесса

Я 2 дня уже немогу найти решения, пробовал менять локаль, ставить директиву #define UNICODE.

Подскажите если кто знает как корректно читать любые символы из процесса?

Добавлено через 2 часа 27 минут
Проблема решена, спасибо все кто посмотрел.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 20:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение UNICODE символов из STDOUT процесса (C++):

Чтение из файла unicode-символов - C++
Добрый день. помогите пожалуйста с таким вопросом. Имеется файл, сохранённый с кодировкой unicode. в нём записаны символы ζϢ. ...

Чтение из stdin и запись в stdout бинарной информации - C++
Привет. Посмотрите, пожалуйста. Мне нужен т.н. "прозрачный" ехе-шник, чтобы он передавал в StdOut тоже, что и получил из StdIn. ...

Чтение Unicode - C++
Есть файл в кодировке Unicode. Надо вывести его содержимое в другой файл и в консоль. Использую двухбайтовый тип wchar, но вместо текста...

Чтение файла в Unicode формате - C++
Как можно за одно обращение к потоку забрать не один байт, а сразу два? Необходимо считать все символы из текстового файла в UNICODE в...

CStdioFile не поддерживает чтение файлов в формате Unicode. Что делать? - C++
К сожалению CStdioFile не поддерживает чтение текстовых файлов в формате Unicode. Может быть кто-нибудь видел класс осуществляющий нечто...

Вывод специальных символов unicode в консоль - C++
Подскажите, товарищи, как можно вывести специальные юникод символны в консоль? (например ☭ ±). Всё перепробовал, ответа так и не получил.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
12.06.2014, 23:03 #2
И в чём была проблема-то?
0
Patron
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 2
16.06.2014, 15:10  [ТС] #3
Проблема была в некорректной кодовой странице по умолчанию у запускаемого процесса. Изменение кодовой страницы командой chcp уже запущенного процесса исправило проблему. То есть после изменения кодовой страницы последующие кириллические символы начали считыватся корректно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 15:10
Привет! Вот еще темы с ответами:

Записать в файл 255 однобайтовых символов в Unicode - C++
Здравствуйте, как записать в файл .txt 255 однобайтовых Unicode символов, чтоб потом их можно было считать ?

Чтение строки из памяти стороннего процесса - C++
Никогда не думал, что будут проблемы с чтением строки из памяти, но они есть :D Пишу так: cout << Proc.Read<PCHAR>(dwAddr) << endl; ...

Чтение из памяти стороннего процесса и запись в файл массива типа doouble - C++
Здравствуйте. Помогите кто может) В общем надо написать прогу которая будет читать мой массив из Visual Studio 2010 во время отладки (то...

Чтение символов с консоли - C++
Как записать в строку уже выведенные на консоль символы, в том числе пробелы? scanf ждет, что я их введу с клавиатуры Среда - Борланд...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru