WideChars'n'Console

Тема в разделе "WASM.WIN32", создана пользователем Zero Ice, 9 авг 2005.

  1. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Пытаюсь ловить вывод с консоли дочернего процесса. Для этого использую пайпы. Если консоль выводит всё через WriteConsoleA, то перехват успешен, если же через юникод-версию, то ReadFile возвращает пустоту. Из MSDN выяснил, что ReadFile - читает только Ansi.

    Может кто-нибудь знает способ чтения юникод-инфы?
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    ReadFile не может возвращать пустоту. Такого типа возвращаемого значения нет. Она может вернуть либо True, либо False. При этом заполняется переменная, адрес которой - 4-й параметр ф-ции.



    Кроме того она не читает ansi или unicode, она читает указанное ей количество байт. Что в этих байтах ей всё равно.



    Так что возвращает ReadFile?
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    "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."



    Оно нужно?
     
  4. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Пустота и правда интересное слово.

    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), но дочерний процесс падает при попытке вывода.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Ему всё равно. Он не "читает" в прямом смысле слова, чтобы отказаться от unicode string. ReadFile загружает в указанный буфер указанное количество байт из указанного файла. Что в этом файле - неважно.

    А твоя проблема не в ReadFile, а в том, что ты не можешь записать в файл из своей консоли. Естественно, ReadFile ничего не прочитает из файла, если туда ничего не было записано:

     
  6. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Есть какой-нибудь объект, в который может писАть WriteConsoleW? (и который был бы наследуемым)
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Zero Ice

    GetStdHandle позволяет получить требуемые тебе описатели, которые потом можно назначить дочернему процессу в структуре STARTUPINFO передаваемой CreateProcess.
     
  8. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    GetStdHandle вернёт моей консоли, и тога вывод будет в неё. (А у меня основная прога -консольная и свою консоль (увы) захламлять нельзя :dntknw:)
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    попробуй использовать доп. буфер создаваемый CreateConsoleScreenBuffer
     
  10. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    CreateConsoleScreenBuffer - если я передаю его хэндл в дочерний процесс, то дочерний падает с ошибкой (доступ к памяти)
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Zero Ice

    Странно, я когда передаю его (в STARTUPINFO.hStdOutput), все работает. Смотри что у тебя за проблемы в дочернем процессе.