Pakonigoosy
@Pakonigoosy
Разработчик ПО

Почему неверно работает ReadConsole?

.386
.model flat,stdcall
option casemap:none
include ..\INCLUDE\kernel32.inc 
include ..\INCLUDE\user32.inc 
includelib ..\LIB\kernel32.lib 
includelib ..\LIB\user32.lib

.data
state     db 4 dup(7)
continue  db 1
input	  dd ?
input_buf dd 3 dup(?)
read	  db ?
output    dd ?
written   db ?
.code
start:
invoke AllocConsole
invoke GetStdHandle, -10
mov input,eax
invoke GetStdHandle, -11
mov output,eax
main:
invoke  Sleep, 2000
invoke ReadConsole, ADDR input, ADDR input_buf, 1, ADDR read, 0

invoke WriteConsoleA, output, ADDR input_buf, 3, ADDR written, 0
invoke ExitProcess,0  
end start

Есть такой код. По задумке он должен считывать пользовательский ввод и показывать его на экране. Но во время выполнения программы, я ничего не могу ввести в консоль, а введенные мною символы показываются только после завершения работы с программой, как будто это команда командной строки
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@pfemidi
Тут могло бы быть краткое описание меня
Во-первых, не
invoke ReadConsole, ADDR input, ADDR input_buf, 1, ADDR read, 0

а
invoke ReadConsole, input, ADDR input_buf, 1, ADDR read, 0

В данном случае надо не адрес переменной, а её содержимое. Поэтому, кстати, и не читается ничего.

Во-вторых, переменные read и written должны быть размером не db, а dd. ReadConsole возвращает DWORD, а не BYTE и само собой возвращаемое значение read забивает собой ранее полученное output, там получаются нули и поэтому ничего не выводится.

В-третьих, судя по
invoke ReadConsole, input, ADDR input_buf, 1, ADDR read, 0
производится чтение ОДНОГО символа, а выводится
invoke WriteConsoleA, output, ADDR input_buf, 3, ADDR written, 0

почему-то три.

Ну и чисто косметически:
а) почему input_buf объявлен как массив DWORD? его надо объявлять как массив BYTE
input_buf db КОЛИЧЕСТВО_БАЙТ_ПЛАНИРУЕМОЕ_ПРОЧИТАТЬ dup(?)

б) нафига вызов Sleep? он там нафиг не нужен
в) зачем ReadConsole, но при этом WriteConsoleA? Или все *A, или уж все функции (что IMHO лучше) все функции без *A в конце.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
AST Москва
от 400 000 ₽
PravoTech Москва
от 200 000 до 310 000 ₽
от 150 000 до 250 000 ₽