Тарабарщина из ReadFile()?

Я перенаправил стандартный вывод java.exe с помощью канала. Теперь я читаю вывод, используя ReadFile и буфер символов:

ReadFile( childStdOUTRd, buffer, sizeof(char) * 4096, &read, NULL);

Буферу будут назначены правильные данные. Но если я изменю его на TCAHR[4096]:

ReadFile( childStdOUTRd, buffer, sizeof(TCHAR) * 4096, &read, NULL);

Буфер получил тарабарщину. Я что-то пропустил?


person zzy    schedule 24.07.2015    source источник
comment
Как вы решаете, что буфер получил тарабарщину?   -  person M.M    schedule 24.07.2015
comment
@MattMcNabb Эти слова нельзя прочитать.   -  person zzy    schedule 24.07.2015
comment
@buttifulbuttefly Это wchar_t.   -  person zzy    schedule 24.07.2015
comment
@zzy, как ты пытаешься их прочитать? Можете ли вы показать код, который вы используете для их чтения.   -  person M.M    schedule 24.07.2015
comment
@MattMcNabb Это то же самое, что и msdn .microsoft.com/zh-cn/library/windows/desktop/ , просто измените буфер на tchar, а дочерний процесс — java.exe (запустите игру .jar).   -  person zzy    schedule 24.07.2015


Ответы (1)


Во-первых, вы должны проверить возвращаемое значение ReadFile. Если он вернул FALSE, то чтение завершилось неудачно, и данные могли быть тарабарщиной.

Также проверьте значение read. Там будет указано, сколько символов было прочитано. Не пытайтесь работать с чем-либо в буфере за пределами значения read байт.

Далее функция ReadFile получает необработанные байты, она их не интерпретирует. Если в вашей системе TCHAR определено как 16-битное wchar_t, то этот вызов будет считывать 8192 байтов из входного потока. Он должен работать правильно.

Вы не сказали, как вы определили, что буфер получил «тарабарщину». Если вы пытаетесь сделать вид, что буфер содержит фактические wchar_ts, но входной поток не содержит wchar_ts, то это не имеет смысла. Решение этой проблемы: не делай этого.

Наконец, TCHAR не актуален последние 15 лет. Используйте либо char, либо wchar_t в зависимости от ваших потребностей.

person M.M    schedule 24.07.2015
comment
Кажется, вывод дочернего процесса не может быть передан в TCHAR. - person zzy; 24.07.2015