Пытаюсь ловить вывод с консоли дочернего процесса. Для этого использую пайпы. Если консоль выводит всё через WriteConsoleA, то перехват успешен, если же через юникод-версию, то ReadFile возвращает пустоту. Из MSDN выяснил, что ReadFile - читает только Ansi. Может кто-нибудь знает способ чтения юникод-инфы?
ReadFile не может возвращать пустоту. Такого типа возвращаемого значения нет. Она может вернуть либо True, либо False. При этом заполняется переменная, адрес которой - 4-й параметр ф-ции. Кроме того она не читает ansi или unicode, она читает указанное ей количество байт. Что в этих байтах ей всё равно. Так что возвращает ReadFile?
"Windows Me/98/95: ReadConsoleOutputW is supported by the Microsoft Layer for Unicode. To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows Me/98/95 Systems." Оно нужно?
Пустота и правда интересное слово. ReadFile читает 0 байт. И ему абсолютно не всё равно, что это - юникод или Ansi. Вот выдержка из MSDN: ReadConsole reads keyboard input from a console's input buffer. It behaves like the ReadFile function, except that it can read in either Unicode (wide-character) or ANSI mode. To have applications that maintain a single set of sources compatible with both modes, use ReadConsole rather than ReadFile. Although ReadConsole can only be used with a console input buffer handle, ReadFile can be used with other handles (such as files or pipes). ReadConsole fails if used with a standard handle that has been redirected to be something other than a console handle. Т.к. моя прога порождает консоль, я перенаправляю вывод в пайпы (также перенаправлял в файл. Результат не меняется). В пайпы (файлы) пишутся только Ansi сиволы. WriteConsoleW отображает текст на консоли, но в другом объекте (файл/пайп) - пусто. Как-будто ничего и не писали. Меня интересует - есть ли возможность ещё как-нибудь перенаправить и читать инфу? 2alpet ReadConsoleOutputW - подходит по идее идеально. Но как добраться до хэндлов консоли в дочернем процессе? Мне пришла такая идея, как создать буфер консоли (CreateConsoleScreenBuffer) и выводить инфу в него. (тогда я как раз бы смог читать всё через ReadConsoleOutputW), но дочерний процесс падает при попытке вывода.
Ему всё равно. Он не "читает" в прямом смысле слова, чтобы отказаться от unicode string. ReadFile загружает в указанный буфер указанное количество байт из указанного файла. Что в этом файле - неважно. А твоя проблема не в ReadFile, а в том, что ты не можешь записать в файл из своей консоли. Естественно, ReadFile ничего не прочитает из файла, если туда ничего не было записано:
Zero Ice GetStdHandle позволяет получить требуемые тебе описатели, которые потом можно назначить дочернему процессу в структуре STARTUPINFO передаваемой CreateProcess.
GetStdHandle вернёт моей консоли, и тога вывод будет в неё. (А у меня основная прога -консольная и свою консоль (увы) захламлять нельзя )
CreateConsoleScreenBuffer - если я передаю его хэндл в дочерний процесс, то дочерний падает с ошибкой (доступ к памяти)
Zero Ice Странно, я когда передаю его (в STARTUPINFO.hStdOutput), все работает. Смотри что у тебя за проблемы в дочернем процессе.