Помогите разобраться с диалогом (edit и buttons)

Тема в разделе "WASM.BEGINNERS", создана пользователем Adrax, 9 июл 2007.

  1. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Уважаемые программисты!
    Эта тема является логичным продолжением этой: http://www.wasm.ru/forum/viewtopic.php?id=21522

    Я пытаюсь создать диалог: edit для ввода буквы диска и три button'а - для открытия лотка сидюка, закрытия его и для выхода из программы.
    Привожу исходники:
    .asm
    Код (Text):
    1. format PE GUI 4.0
    2. include 'win32axp.inc'
    3.  
    4. ID_OPEN = 101h
    5. ID_CLOSE = 102h
    6. ID_EXIT = 103h
    7. ID_EDIT = 104h
    8.  
    9. FILE_GENERIC_READ = 1
    10.  
    11. FILE_DEVICE_MASS_STORAGE = 2Dh
    12. METHOD_BUFFERED = 0
    13. FILE_ANY_ACCESS = 0
    14. FILE_READ_ACCESS = 1
    15. FILE_WRITE_ACCESS = 2
    16.  
    17. IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (202h shl 2) or METHOD_BUFFERED
    18. IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (203h shl 2) or METHOD_BUFFERED
    19.  
    20. .data
    21.  bukva rb 1
    22.  handl dd ?
    23.  xren db '\\.\',0,0
    24.  dvoet db ':',0
    25.  byr dd ?
    26.  
    27. .code
    28. fuck:
    29. invoke GetModuleHandle,0
    30. invoke DialogBoxParam,eax,69,HWND_DESKTOP,ProceduraDialoga,0
    31. invoke ExitProcess,0
    32.  
    33. proc ProceduraDialoga,hwnddlg,msg,wparam,lparam
    34.  push ebx
    35.  push esi
    36.  push edi
    37.   cmp [msg],WM_INITDIALOG
    38.   je Initialization
    39.   cmp [msg],WM_COMMAND
    40.   je Command
    41.   cmp [msg],WM_CLOSE
    42.   je Exit
    43.  xor eax,eax
    44.  jmp Finish
    45.  
    46. Command:
    47.  cmp [wparam],BN_CLICKED shl 16 + ID_EXIT
    48.  je Exit
    49.  mov eax,[handl]
    50.  test eax,eax
    51.  jnz knopki
    52.  
    53.  invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2
    54.  test eax,eax
    55.  jz Initialization
    56.  invoke lstrcat,xren,bukva
    57.  invoke lstrcat,xren,dvoet
    58.  invoke CreateFile,xren,FILE_GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
    59.  cmp eax,-1
    60.  je Initialization
    61.  mov [handl],eax
    62.  jmp Command
    63.  
    64. knopki:
    65.  cmp [wparam],BN_CLICKED shl 16 + ID_CLOSE
    66.  je Close
    67.  cmp [wparam],BN_CLICKED shl 16 + ID_OPEN
    68.  je Open
    69.  
    70. Initialization:
    71.  xor eax,eax
    72.  inc eax
    73.  
    74. Finish:
    75.  pop edi
    76.  pop esi
    77.  pop ebx
    78.  ret
    79.  
    80. Exit:
    81.  invoke EndDialog,[hwnddlg],-1
    82.  jmp Finish
    83.  
    84. Open:
    85.  invoke DeviceIoControl,[handl],IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,byr,0
    86.  invoke CloseHandle,[handl]
    87.  invoke RtlZeroMemory,handl,4
    88.  jmp Initialization
    89.  
    90. Close:
    91.  invoke DeviceIoControl,[handl],IOCTL_STORAGE_LOAD_MEDIA,0,0,0,0,byr,0
    92.  invoke CloseHandle,[handl]
    93.  invoke RtlZeroMemory,handl,4
    94.  jmp Initialization
    95.  
    96. endp
    97. .end fuck
    98.  
    99. section '.rsrc' resource from 'CDzap.res' data readable discardable
    .rc
    Код (Text):
    1. #define LANG_ENGLISH 0x9
    2. #define LANG_RUSSIAN 0x19
    3. #define DS_MODALFRAME 0x0080L
    4. #define WS_POPUP 0x80000000L
    5. #define WS_CAPTION 0x0C00000L
    6. #define WS_SYSMENU 0x80000L
    7. #define BS_DEFPUSHBUTTON 0x1
    8. #define WS_CHILD 0x40000000L
    9. #define WS_VISIBLE 0x10000000L
    10. #define WS_TABSTOP 0x10000L
    11. #define BS_PUSHBUTTON 0x0
    12. #define SS_LEFT 0x0
    13. #define ES_LEFT 0x0
    14. #define WS_BORDER 0x800000L
    15. #define ID_OPEN 0x101L
    16. #define ID_CLOSE 0x102L
    17. #define ID_EXIT 0x103L
    18. #define ID_EDIT 0x104L
    19.  
    20.  
    21. 69 DIALOG 70, 70, 160, 50
    22. STYLE  DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    23. CAPTION "Владыка CD-ROM'à  ver. 0.0.0.1"
    24. LANGUAGE LANG_ENGLISH, LANG_RUSSIAN
    25. FONT 8, "MS Sans Serif"
    26. {
    27. CONTROL "Владыка CD-ROM'à:", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 10, 100, 8
    28. CONTROL "", ID_EDIT, EDIT, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 110, 10, 30, 13
    29. CONTROL "Открыть",ID_OPEN, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 30, 45, 15
    30. CONTROL "Закрыть",ID_CLOSE, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 30, 45, 15
    31. CONTROL "Выход",ID_EXIT,BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP,110, 30, 45, 15
    32. }
    Проблема такова: диалог отрабатывает только одно нажатие на кнопку, после чего можно кликать мышью до посинения - реакции никакой. Перепробовал уже сотни вариантов, тасовал код и в хвост и в гриву - ничего не получается...
    Прошу помощи у знатоков. Поделитесь советом и кодом
     
  2. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Никто мне не хочет помочь... Негодяи:)
    Ладно, сам въехал, с подачи q_q
    Исходник нужно было писать так:
    Код (Text):
    1. format PE GUI 4.0
    2. include 'win32axp.inc'
    3.  
    4. ID_OPEN = 101h
    5. ID_CLOSE = 102h
    6. ID_EXIT = 103h
    7. ID_EDIT = 104h
    8.  
    9. FILE_GENERIC_READ = 1
    10.  
    11. FILE_DEVICE_MASS_STORAGE = 2Dh
    12. METHOD_BUFFERED = 0
    13. FILE_ANY_ACCESS = 0
    14. FILE_READ_ACCESS = 1
    15. FILE_WRITE_ACCESS = 2
    16.  
    17. IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (202h shl 2) or METHOD_BUFFERED
    18. IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (203h shl 2) or METHOD_BUFFERED
    19.  
    20. .data
    21.  bukva rb 1
    22.  handl dd ?
    23.  xren rb 7
    24.  dvoet db ':',0
    25.  byr dd ?
    26.  
    27. .code
    28. fuck:
    29. invoke GetModuleHandle,0
    30. invoke DialogBoxParam,eax,69,HWND_DESKTOP,ProceduraDialoga,0
    31. invoke ExitProcess,0
    32.  
    33. proc ProceduraDialoga,hwnddlg,msg,wparam,lparam
    34.  push ebx
    35.  push esi
    36.  push edi
    37.   cmp [msg],WM_INITDIALOG
    38.   je Initialization
    39.   cmp [msg],WM_COMMAND
    40.   je Command
    41.   cmp [msg],WM_CLOSE
    42.   je Exit
    43.  xor eax,eax
    44.  jmp Finish
    45.  
    46. Command:
    47.  cmp [wparam],BN_CLICKED shl 16 + ID_EXIT
    48.  je Exit
    49.  cmp [wparam],BN_CLICKED shl 16 + ID_CLOSE
    50.  je Close
    51.  cmp [wparam],BN_CLICKED shl 16 + ID_OPEN
    52.  je Open
    53.  
    54. Initialization:
    55.  xor eax,eax
    56.  inc eax
    57.  
    58. Finish:
    59.  pop edi
    60.  pop esi
    61.  pop ebx
    62.  ret
    63.  
    64. Exit:
    65.  invoke EndDialog,[hwnddlg],-1
    66.  jmp Finish
    67.  
    68. Open:
    69.  call Edit
    70.  invoke DeviceIoControl,[handl],IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,byr,0
    71.  jmp Initialization
    72.  
    73. Close:
    74.  call Edit
    75.  invoke DeviceIoControl,[handl],IOCTL_STORAGE_LOAD_MEDIA,0,0,0,0,byr,0
    76.  jmp Initialization
    77.  
    78. Edit:
    79. invoke RtlZeroMemory,xren,6
    80.  invoke lstrcpy,xren,'\\.\'
    81. invoke CloseHandle,[handl]
    82. invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2
    83.  invoke lstrcat,xren,bukva
    84.  invoke lstrcat,xren,dvoet
    85.  invoke CreateFile,xren,FILE_GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
    86.  mov [handl],eax
    87.  
    88.  retn
    89.  
    90. endp
    91.  
    92. .end fuck
    93.  
    94. section '.rsrc' resource from 'CDzap.res' data readable discardable
    Вдруг, кто будет по этой же теме мучаться - авось, пригодится...