anykey в asm-вставке в С++ под Win

Тема в разделе "WASM.WIN32", создана пользователем sarmat, 27 янв 2006.

  1. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    Нужно как-то как можно проще организовать стоп-процесс при выполнении ассемблерной вставки. Под DOS было просто:

    mov ah,1

    int 21h

    Делать это средствами С++ по задаче не выгодно, а в asm-вставке пока не сообразил как
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Если нужно сделать типа шелл-команды pause, то есть несколько вариантов:



    1. Собственно говоря, сама команда pause.

    2. Документированный способ: WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE)), но просто так он работать не будет.

    3. Более навороченный способ:
    Код (Text):
    1.    hIn = GetStdHandle(STD_INPUT_HANDLE);
    2.    while(ReadConsoleInput(hIn,&input_record,1,&aux)){
    3.       if(input_record.EventType == KEY_EVENT) break;
    4.       Sleep(0);
    5.    }


    К сожалению, этот последний способ всё равно не так стабильно работает на последних виндах как хотелось бы.
     
  3. sarmat

    sarmat New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    15
    Адрес:
    Russia
    Quantum

    Я так и чувствовал, что без консольной функции не обойтись. Еще маленький вопрос. Эти три строки можно запихнуть в создаваемую собой макробиблиотеку, т.к. хочу это все вызывать в ассемлерной вставке несколькораз
     
  4. khv_test

    khv_test New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    135
    char getch()

    {



    DWORD cmode,er;

    INPUT_RECORD ir;

    GetConsoleMode((HANDLE)GetStdHandle(STD_INPUT_HANDLE),&cmode);

    SetConsoleMode((HANDLE)GetStdHandle(STD_INPUT_HANDLE),0);

    while(ReadConsoleInput((HANDLE)GetStdHandle(STD_INPUT_HANDLE),&ir,1,&er))

    {

    if(ir.EventType==KEY_EVENT)

    {

    if(ir.Event.KeyEvent.bKeyDown==TRUE)

    break;

    }

    };

    SetConsoleMode((HANDLE)GetStdHandle(STD_INPUT_HANDLE),cmode);

    return(ir.Event.KeyEvent.uChar.AsciiChar);

    }
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    khv_test

    У меня ещё FlushConsoleInputBuffer перед циклом для большей надёжности ;)



    sarmat

    Можно, конечно. Или поместить пример khv_test в статическую либу...