· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Проблема с DialogBoxIndorectParamA

Посл.отвђт Сообщенiе


Дата: Окт 5, 2004 08:46:23

Здравствуйте,

Вот возникла проблема с тем, что код работает нормально в 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


Дата: Окт 5, 2004 09:27:48

Я думаю, что неплохо бы сохранить ebp в начале процедуры, а затем восстановить в конце.

З.Ы.
Можно поинтересоваться к чему такой космический код:
call deltaproc
deltaproc:
pop ebp
sub ebp, offset deltaproc <=== ebp=0 ????????
jmp stackprepare


Дата: Окт 5, 2004 11:14:04

Kvazimoda
к чему такой космический код
Смотри Причем тут EBP?


Дата: Окт 5, 2004 15:01:29

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


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037