Глюк с ReadFile из консоли

Тема в разделе "WASM.WIN32", создана пользователем maxdiver, 26 авг 2007.

  1. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Ситуация в программе такова. С помощью GetStdHandle (STD_INPUT_HANDLE) я получаю хэндл к консоли. Затем вызываю ReadFile и считываю 1 байт.

    Всё прекрасно работает, кроме одной "исключительной" ситуации. Если я запускаю прогу из студии (версии 2005 SP1) и прямо во время запуска проги нажимаю какие-нибудь буквы, то потом ReadFile вместо первого символа возвращает символ 'l' (ASCII 108).

    В попытках избежать этого пробовал FlushConsoleInputBuffer, LockFile, но ничего не получилось.

    Но самое интересное, что при работе через стандартную библиотеку C никаких глюков нет.

    Может быть, у кого-нибудь есть идеи? Заранее благодарен.
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    напишите по пунктам как вы её запускаете из студии ? я не понял
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    rain
    1) нажимаю F5
    2) появляется консольное окно моей проги
    3) сразу после его появления нажимаю какие-нибудь буквы (нужно успеть где-то в течение полсекунды после появления окна)
    4) программа считывает первый символ, и он оказывается 'l', хотя я нажимал другую букву
    5) дальше все символы считываются верно

    Причём проявляется это чудо только при запуске из Studio.
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    странно, раз кодом делиться не хочешь, могу посоветовать ставить бряк на первый ReadFile смотреть на буферы, можно попробовать считать по одному символу GetConsoleMode \ ~ENABLE_LINE_INPUT
    на всякий случай проверь код:
    Код (Text):
    1. #undef UNICODE
    2. #undef _UNICODE
    3. #include <windows.h>
    4. #include <tchar.h>
    5.  
    6. #pragma comment(linker, "/nodefaultlib")
    7. #pragma comment(linker, "/entry:mymain")
    8. #pragma comment(linker, "/subsystem:console")
    9.  
    10. void mymain()
    11. {
    12.  
    13.     UCHAR str[256];
    14.     HANDLE hIn, hOut;
    15.     ULONG rw;  
    16.  
    17.     hIn = GetStdHandle(STD_INPUT_HANDLE);
    18.     hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    19.  
    20.     ReadFile(hIn, str, 1, &rw, 0);
    21.  
    22.     WriteFile(hOut, str, lstrlen(str), &rw, 0);
    23.  
    24.     Sleep(1000);
    25. }
     
  5. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    rain
    Код я не выкладывал, потому что там ничего особенного. Практически то же самое, что и у тебя.

    При запуске твоей программы те же глюки. Только на этот раз вводится "1 0 1 . e", ну и так далее какой-то бред. Хотя стоит подождать секунду после запуска - и всё будет нормально.

    Кстати, если запускать без отладчика (ctrl+F5), то глюков тоже нет...
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    rain
    WriteFile(hOut, str, lstrlen(str), &rw, 0);
    Это должно работать?
     
  7. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    q_q
    Нет, конечно. Код, приведённый rain, не до конца точен.
    Я исправил так:
    WriteFile(hOut, str, 1, &rw, 0);
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    q_q
    код писался просто для примера за 2 минуты, это работало у меня, а ваще конечно не мешало бы обнулить память :)
    даже и не знаю с чем связано, читай в цикле посимвольно и ставь бряк на чтение, может чё-то и прояснится
     
  9. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    rain
    Ну так я в своей проге и читаю посимвольно. И ReadFile возвращает TRUE, и в Size кладёт 1. Но в буфере оказывается не то :dntknw:

    Это можно было бы списать на какие-нибудь баги в ReadFile, если бы не тот факт, что RTL нормально справляется с этой ситуацией.