баг в структуре KEY_EVENT_RECORD

Тема в разделе "WASM.WIN32", создана пользователем rain, 24 окт 2006.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    описание в масме:
    Код (Text):
    1. KEY_EVENT_RECORD STRUCT
    2.   bKeyDown           DWORD ?
    3.   wRepeatCount      WORD ?
    4.   wVirtualKeyCode   WORD ?
    5.   wVirtualScanCode  WORD ?
    6.   UNION
    7.     UnicodeChar     WORD ?
    8.     AsciiChar       BYTE ?
    9.   ENDS
    10.   dwControlKeyState DWORD ?
    11. KEY_EVENT_RECORD ENDS
    в МСДН:
    Код (Text):
    1. typedef struct _KEY_EVENT_RECORD {  
    2. BOOL bKeyDown;  
    3. WORD wRepeatCount;  
    4. WORD wVirtualKeyCode;  
    5. WORD wVirtualScanCode;  
    6. union {    
    7.  WCHAR UnicodeChar;    
    8.  CHAR AsciiChar;  } uChar;  
    9. DWORD dwControlKeyState;
    10. } KEY_EVENT_RECORD;
    на практике же в начале структуры у меня какие-то непознанные 2 байта
    пофиксил:
    Код (Text):
    1. KEY_EVENT_RECORD STRUCT
    2.     xx word ?
    3.  
    4.   bKeyDown           DWORD ?
    5.   wRepeatCount      WORD ?
    6.   wVirtualKeyCode   WORD ?
    7.   wVirtualScanCode  WORD ?
    8.   UNION
    9.     UnicodeChar     WORD ?
    10.     AsciiChar       BYTE ?
    11.   ENDS
    12.   dwControlKeyState DWORD ?
    13. KEY_EVENT_RECORD ENDS
    работает...
    З.Ы. может это просто 2 часа ночи?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    а да, код чуть не забыл:
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5.  
    6.  
    7. include windows.inc
    8. include kernel32.inc
    9. include user32.inc
    10.  
    11. includelib kernel32.lib
    12. includelib user32.lib
    13.  
    14. include d:\masm32\macros\macros.asm
    15. .const
    16. .data?
    17.     buflen equ 255
    18.     buf db buflen dup (?)
    19.     hStdIn dd ?
    20.     hStdOut dd ?
    21.     ir INPUT_RECORD <>
    22.  
    23. .data
    24. .code
    25. start:
    26.     invoke AllocConsole
    27.     invoke GetStdHandle,STD_INPUT_HANDLE
    28.    
    29.     mov hStdIn,eax
    30.     invoke GetStdHandle,STD_OUTPUT_HANDLE
    31.     mov hStdOut,eax
    32.    
    33.     .while TRUE
    34.         invoke ReadConsoleInput,hStdIn,offset ir,1,offset buf
    35.         .if ir.EventType==KEY_EVENT
    36.             .if ir.KeyEvent.bKeyDown==1
    37.    
    38.                 .if ir.KeyEvent.wVirtualKeyCode==VK_CONTROL
    39.                     invoke MessageBox,0,0,0,0
    40.                    
    41.                    
    42.                 .endif
    43.             .endif
    44.                   .endif
    45.     .endw
    46.    
    47.     invoke FreeConsole
    48.  
    49.     invoke ExitProcess,0
    50. end start
     
  3. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    rain

    Во-первых buflen equ 255
    - лучше buflen equ 256 для кратности :)

    Во-вторых: на практике же в начале структуры у меня какие-то непознанные 2 байта
    - Это наверно INPUT_RECORD.EventType (см. INPUT_RECORD в SDK)
     
  4. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    ЗЫ:
    Такую программульку я бы писал в MSVC++
    - не вижу смысла писать на MASM32, размер и скорость были бы такими же :)
     
  5. rain

    rain New Member

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

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    а equ 255 здесь имеет огромное отношение к топику :)
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ir.u.KeyEvent
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    2Asterix непонял, чё такое u ?
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  10. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    разве можно так обращаться ? и к чему бы это?
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    rain
    ты на масме программишь, вот и использую правила масма и обращайся к структурам
    как это принято в масме, тогда не будет возникать непонятных глюков
     
  12. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    нивкурил, пример плиз
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    http://www.wasm.ru/article.php?article=1001028
     
  14. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    так. причём тут u? по той ссылке что ты дал u это имя юниона вне структуры, если юнион в структуре то у него нет имени (есть только имена переменных структур, что он содержит), обращаться к нему можно (и никак иначе? - всмысле с-вами масма) только как я сделал это выше.
    ir.u.KeyEvent в данном случае бред, ведь нету в структуре INPUT_RECORD такой переменной:
    Код (Text):
    1. INPUT_RECORD STRUCT
    2.   EventType WORD ?
    3.   UNION
    4.     KeyEvent                KEY_EVENT_RECORD            <>
    5.     MouseEvent              MOUSE_EVENT_RECORD          <>
    6.     WindowBufferSizeEvent   WINDOW_BUFFER_SIZE_RECORD   <>
    7.     MenuEvent               MENU_EVENT_RECORD           <>
    8.     FocusEvent              FOCUS_EVENT_RECORD          <>
    9.   ENDS
    10. INPUT_RECORD ENDS
    люди! пожалуйста обратите кто-то внимание и помогите разобраться втф
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    хм, действительно это имя, был не прав

    тогда возможно проблема в выравнивании структуры
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    KEY_EVENT_RECORD объявлена правильно, т.к. это упакованная структура с "ручным" выравниванием на 2 байта. А вот INPUT_RECORD - неправильно, т.к. это структура с автовыравниванием на 4. Нужно добавить выравнивающий word после EventType
    Код (Text):
    1. INPUT_RECORD STRUCT
    2.   EventType WORD ?
    3.   Unused    WORD ?  ;выравнивающий ворд
    4.   UNION
    5.     ...
    6.   ENDS
    7. INPUT_RECORD ENDS
     
  17. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    наконец-то разобрались, всем спасиба
    З.Ы. 2leo как ты об этом узнал?
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Догадался ;) Заглянул в дельфийские сорцы - там KEY_EVENT_RECORD объявлена как packed record, а INPUT_RECORD - нет, т.е.выравненная. Значит тоже самое должно быть и в виндовых хидерах
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет =)
    Просто по умолчанию там выравниваются поля на границу sizeof(поле), я не прав?
     
  20. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    и все-таки, в сях нужно обращаться как

    ir.Event.KeyEvent
    значит соответсвенно и в масме нужно оформлять структуру так чтоб обращаться также,
    может от этого глюк зависит?

    Код (Text):
    1. typedef struct _INPUT_RECORD { // ir  
    2.     WORD EventType;  
    3.     union {
    4.         KEY_EVENT_RECORD KeyEvent;
    5.         MOUSE_EVENT_RECORD MouseEvent;
    6.         WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
    7.         MENU_EVENT_RECORD MenuEvent;
    8.         FOCUS_EVENT_RECORD FocusEvent;
    9.     } Event;
    10. } INPUT_RECORD;