DialogBoxParam в WinXP

Тема в разделе "WASM.BEGINNERS", создана пользователем Grig de Griz, 6 окт 2006.

  1. Grig de Griz

    Grig de Griz New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2005
    Сообщения:
    15
    Hi, All!

    Народ, что-то я туплю с утра. Попросили лабу написать с менюшкой и показом диалога на TASM’е максимально простым/классическим способом, наступил уже на все детские грабли какие мог, убил целый час. Позор на мою седую голову. :)
    Последняя проблема: все работает, но только под Win98, в WinXP диалог глючит – не выводится само окно, только его контролы. Последние, кстати, работают как от них требуется. Код следующий:

    Код (Text):
    1. ; по пункту меню
    2. @@idmabout:
    3.     push    0
    4.     push    offset AboutDlgProc
    5.     push    @@hwnd
    6.     push    dword ptr IDD_ABOUTDLG
    7.     push    hInst  
    8.     call    DialogBoxParamA
    9.     jmp @@exit
    10. @@exit:
    11.     mov eax, 0
    12.     ret
    Код (Text):
    1. ; процедура диалога
    2. AboutDlgProc    proc    
    3. arg @@hdlg:DWORD, @@message:DWORD, @@wparam:DWORD, @@lparam:DWORD
    4. uses    eax, ebx, edi, esi
    5.     mov eax, @@message
    6.     cmp ax, WM_INITDIALOG
    7.     je  @@wminitdialog
    8.     cmp ax, WM_COMMAND
    9.     jne @@retun_false
    10.     mov ebx, @@wparam   ;в bx идентификатор элемента управления
    11.     cmp bx, IDOK   
    12.     je  @@idok
    13.     jmp @@retun_false
    14. @@wminitdialog:
    15.     jmp @@retun_true
    16. @@idok:
    17.     push    NULL
    18.     push    @@hdlg
    19.     call    EndDialog
    20.     jmp @@retun_true
    21. @@retun_false:
    22.     mov eax, 0
    23.     ret
    24. @@retun_true:
    25.     mov eax, 1
    26.     ret
    27. AboutDlgProc    endp
    Грешным делом уже попробовал через DialogBoxParamW, эффект тот же. Где же я тут лажаю?

    P.S.
    Перлы типа "mov eax, 0", там вполне осмыслены – для наглядности программки. А то еще заставят объяснять "что такое отпимизация?" и главное "зачем?". ;)
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Как диалог в ресурсах описан?
     
  3. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Попробуй вместо:
    Код (Text):
    1. push    @@hwnd
    Так:
    Код (Text):
    1. push 0
    А вообще лучше приаттач исходники.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    И сделай InitCommonControls(Ex), если в контролах есть что-то отличное от кнопок/статиков/едитов.

    хех, угораздило
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Без него контролы не рисуются. А когда контролы есть, но не видно само окно, возможно надо убрать из описания диалога WS_CLIPCHILDREN или WS_CLIPSIBLINGS. Не помню какой из них точно...
     
  6. Grig de Griz

    Grig de Griz New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2005
    Сообщения:
    15
    :2: afybc

    А смысл? Это же хендрел парента. С нулем будет цеплять за десктоп. Впрочем, проверил – все тоже самое и цепляется за десктоп...

    :2: rmn

    Код (Text):
    1. 22000 DIALOGEX 100, 50, 231, 73, 0
    2. STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME | WS_CAPTION
    3. CAPTION "О программе..."
    4. FONT 8, "MS Sans Serif", 0, 0
    5. BEGIN
    6.     ICON 129, 22001, 7, 8, 21, 20
    7.     LTEXT "Приложение Win32 на ассемблере", 22002, 42, 7, 182, 8, SS_NOPREFIX
    8.     LTEXT "Версия", 22003, 42, 20, 25, 8, SS_NOPREFIX
    9.     LTEXT "", 22004, 72, 20, 152, 8
    10.     LTEXT "Copyright © 2006", 22005, 42, 32, 182, 10
    11.     DEFPUSHBUTTON "&OK", IDOK, 89, 51, 50, 14, WS_GROUP
    12. END
    Описание диалога, отковырял от собственной работающей программки. Там вроде все нормально.
    Впрочем, сносил все к минимуму - результат тот же.

    :2: IceStudent
    Кнопка там только и статы, ICON погоду не делает, но InitCommanControls сейчас попробую.
     
  7. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Grig de Griz
    Не сохраняй eax (uses ebx, edi, esi) и будет тебе щастье :)
     
  8. Grig de Griz

    Grig de Griz New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2005
    Сообщения:
    15
    :2: koderr
    Оно! Момент истины! Спасибо! Где были мои глаза? Остается только посыпать голову пеплом. ;)

    :2: All
    Всем спасибо за участие! Все-таки языки высокого уровня в чем-то отупляют, или как минимум делают ленивым. Сто лет уже ничего не писал на чистом асме - все вставки, да дебагеры и вот результат - заблудился в трех соснах. ;) Пойду теперь в наказание писать подробные комментарии к этой поделке.
     
  9. horpis

    horpis New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    154
    я хочу попросить помощи в формате этой темы:
    никак не получается заставить кнопки диалога работать.
    Код (Text):
    1. redsI_Proc proc
    2. lparam equ dword ptr [ebp+014h]
    3. wparam equ dword ptr [ebp+10h]
    4. msg equ dword ptr [ebp+0Ch]
    5. hwnd equ dword ptr [ebp+08h]
    6.     cmp msg, WM_INITDIALOG
    7.     je initdialog_m     ;усли ДА то на метку %1
    8.     cmp msg, WM_COMMAND
    9.     je comdialog_m          ;если ДА
    10.     cmp msg, WM_CLOSE
    11.     jne return_false
    12.     push 0
    13.     push hWnd1
    14.     call EndDialog@8
    15.     jmp return_false
    16. ;%1
    17. initdialog_m:
    18.     push IDC_EDIT1
    19.     push hwnd1
    20.     call GetDlgItem@8
    21.     push eax
    22.     call SetFocus@4
    23. ;   push 0
    24. ;   push 0
    25. ;   push OPEN_ALWAYS
    26. ;   push 0
    27. ;   push 0
    28. ;   push GEN
    29. ;   push offset opt_name
    30. ;   call CreateFileA@28
    31.     jmp return_true
    32. comdialog_m:
    33.     mov eax, wParam
    34.     mov ebx, lParam
    35.     test ebx, 0
    36.     jnz com2_m
    37.     cmp ax, IDM_GETTEXT
    38.     jne nexti_m
    39.     push 512
    40.     push offset buf
    41.     push IDC_EDIT1
    42.     push hWnd1
    43.     call GetDlgItemTextA@16
    44. nexti_m:
    45.     cmp ax, IDM_CLEAR
    46.     jne nexix_m
    47.     push 0
    48.     push IDC_EDIT1
    49.     push hWnd
    50.     call SetDlgItemTextA@12
    51. nexix_m:
    52.     push 0
    53.     push hWnd
    54.     call EndDialog@8
    55. com2_m:
    56.     mov edx, wParam
    57.     shr edx, 010h
    58.     cmp dx, BN_CLICKED
    59.     jne return_true
    60.     cmp ax, IDC_BUTTON1
    61.     jne com3_m
    62.     push offset String
    63.     push IDC_EDIT1
    64.     push hWnd1
    65.     call SetDlgItemTextA@12
    66.     push 0
    67.     push hWnd1
    68.     call EndDialog@8
    69.     jmp return_true
    70. com3_m:
    71.     cmp ax, IDC_CANCEL
    72.     jne return_true
    73.     push 0
    74.     push hWnd
    75.     call EndDialog@8
    76.     jmp return_true
    77. return_false:      
    78.     mov eax, FALSE
    79.     ret
    80. return_true:
    81.     mov eax, TRUE
    82.     ret
    83. game_over:
    84. redsI_Proc endp
     
  10. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    По test ebx, 0 всегда ZF = 1. Соответственно не выполняется
    Код (Text):
    1.     cmp ax, IDM_GETTEXT
    2.     jne nexti_m
    3.     push 512
    4.     push offset buf
    5.     push IDC_EDIT1
    6.     push hWnd1
    7.     call GetDlgItemTextA@16
    8. nexti_m:
    9.     cmp ax, IDM_CLEAR
    10.     jne nexix_m
    11.     push 0
    12.     push IDC_EDIT1
    13.     push hWnd
    14.     call SetDlgItemTextA@12
    Если проверяешь на равенство нулю, то исправь на test ebx, ebx
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    horpis
    В другую тему.