Ситуация в программе такова. С помощью GetStdHandle (STD_INPUT_HANDLE) я получаю хэндл к консоли. Затем вызываю ReadFile и считываю 1 байт. Всё прекрасно работает, кроме одной "исключительной" ситуации. Если я запускаю прогу из студии (версии 2005 SP1) и прямо во время запуска проги нажимаю какие-нибудь буквы, то потом ReadFile вместо первого символа возвращает символ 'l' (ASCII 108). В попытках избежать этого пробовал FlushConsoleInputBuffer, LockFile, но ничего не получилось. Но самое интересное, что при работе через стандартную библиотеку C никаких глюков нет. Может быть, у кого-нибудь есть идеи? Заранее благодарен.
rain 1) нажимаю F5 2) появляется консольное окно моей проги 3) сразу после его появления нажимаю какие-нибудь буквы (нужно успеть где-то в течение полсекунды после появления окна) 4) программа считывает первый символ, и он оказывается 'l', хотя я нажимал другую букву 5) дальше все символы считываются верно Причём проявляется это чудо только при запуске из Studio.
странно, раз кодом делиться не хочешь, могу посоветовать ставить бряк на первый ReadFile смотреть на буферы, можно попробовать считать по одному символу GetConsoleMode \ ~ENABLE_LINE_INPUT на всякий случай проверь код: Код (Text): #undef UNICODE #undef _UNICODE #include <windows.h> #include <tchar.h> #pragma comment(linker, "/nodefaultlib") #pragma comment(linker, "/entry:mymain") #pragma comment(linker, "/subsystem:console") void mymain() { UCHAR str[256]; HANDLE hIn, hOut; ULONG rw; hIn = GetStdHandle(STD_INPUT_HANDLE); hOut = GetStdHandle(STD_OUTPUT_HANDLE); ReadFile(hIn, str, 1, &rw, 0); WriteFile(hOut, str, lstrlen(str), &rw, 0); Sleep(1000); }
rain Код я не выкладывал, потому что там ничего особенного. Практически то же самое, что и у тебя. При запуске твоей программы те же глюки. Только на этот раз вводится "1 0 1 . e", ну и так далее какой-то бред. Хотя стоит подождать секунду после запуска - и всё будет нормально. Кстати, если запускать без отладчика (ctrl+F5), то глюков тоже нет...
q_q Нет, конечно. Код, приведённый rain, не до конца точен. Я исправил так: WriteFile(hOut, str, 1, &rw, 0);
q_q код писался просто для примера за 2 минуты, это работало у меня, а ваще конечно не мешало бы обнулить память даже и не знаю с чем связано, читай в цикле посимвольно и ставь бряк на чтение, может чё-то и прояснится
rain Ну так я в своей проге и читаю посимвольно. И ReadFile возвращает TRUE, и в Size кладёт 1. Но в буфере оказывается не то Это можно было бы списать на какие-нибудь баги в ReadFile, если бы не тот факт, что RTL нормально справляется с этой ситуацией.