Проблема с DialogBoxIndorectParamA

Тема в разделе "WASM.WIN32", создана пользователем sep, 5 окт 2004.

  1. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    Здравствуйте,



    Вот возникла проблема с тем, что код работает нормально в Win2k, а под Win98 выдает ексепшн 0D. При инициализации управление передается в диалог, функция первый раз отрабатывает, а потом ексепшн. Посмотрите пожалуйста что тут не так:



    dlgproc proc

    call deltaproc

    deltaproc:

    pop ebp

    sub ebp, offset deltaproc

    jmp stackprepare



    hDlg dd 0

    uMsg dd 0

    wParam dd 0

    lParam dd 0



    szTextOK db 32 dup (0)

    TextOKSize DD 0

    szHeaderOK db "Read OK",0

    hwndEditOK dd 0



    stackprepare:

    push esi

    mov esi, ebp



    push ebp

    mov ebp, esp



    push dword ptr ds:[ebp+0Ch]

    pop dword ptr ds:[esi+hDlg]

    push dword ptr ds:[ebp+10h]

    pop dword ptr ds:[esi+uMsg]

    push dword ptr ds:[ebp+14h]

    pop dword ptr ds:[esi+wParam]

    push dword ptr ds:[ebp+18h]

    pop dword ptr ds:[esi+lParam]



    pop ebp

    pop esi



    procstart:



    .IF (dword ptr ds:[ebp+uMsg] == WM_COMMAND)

    mov eax, dword ptr ds:[ebp+wParam]

    and eax, 0000FFFFh

    .IF (eax == IDOK)

    ; если была нажата кнопка, то получить дескриптор эдитбокса

    push ID_EDIT1

    mov eax, dword ptr ds:[ebp+hDlg]

    push eax

    call dword ptr ds:[ebp+_GetDlgItem]

    mov dword ptr ds:[ebp+hwndEditOK], eax

    ; получить текст из эдитбокса

    push 32

    mov eax, ebp

    add eax, offset szTextOK

    push eax

    push dword ptr ds:[ebp+hwndEditOK]

    call dword ptr ds:[ebp+_GetWindowTextA]

    mov dword ptr ds:[ebp+TextOKSize], eax



    ; вывести MessageBox с текстом из эдитбокса

    push MB_ICONINFORMATION

    mov eax, ebp

    add eax, offset szHeaderOK

    push eax

    mov eax, ebp

    add eax, offset szTextOK

    push eax

    push 0

    call dword ptr ds:[ebp+_MessageBoxA]



    ; завершить работу диалога

    push 0

    push dword ptr ds:[ebp+hDlg]

    call dword ptr ds:[ebp+_EndDialog]



    jmp quit



    .ELSE

    jmp quit

    .ENDIF

    .ELSE

    jmp quit

    .ENDIF

    quit:

    xor eax,eax

    retn 10h

    dlgproc endp
     
  2. Kvazimoda

    Kvazimoda New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2004
    Сообщения:
    21
    Адрес:
    Russia
    Я думаю, что неплохо бы сохранить ebp в начале процедуры, а затем восстановить в конце.



    З.Ы.

    Можно поинтересоваться к чему такой космический код:

    call deltaproc

    deltaproc:

    pop ebp

    sub ebp, offset deltaproc <=== ebp=0 ????????

    jmp stackprepare
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  4. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    Kvazimoda

    при том, что это адресно независимый обработчик сообщений диалога. Сохранение не помогает, помог переход на другой индексный регистр ESI