Показать сообщение отдельно

  #476  
Старый 04.02.2009, 11:37
Girsoft
Новичок
Регистрация: 23.01.2007
Сообщений: 21
Провел на форуме:
20113

Репутация: 1
По умолчанию

набрал код на масме:
(директивы масма стараюсь сильно не использовать, приближенно к чистому ассемблеру)
Цитата:
.386p

.MODEL FLAT, STDCALL
; -------------------------------------------------------------------------
EXTERN MessageBoxA@16:near
EXTERN CreateWindowExA@48:near
EXTERN DefWindowProcA@16:near
EXTERN DispatchMessageA@4:near
EXTERN ExitProcess@4:near
EXTERN GetMessageA@16:near
EXTERN GetModuleHandleA@4:near
EXTERN PostQuitMessage@4:near
EXTERN RegisterClassA@4:near
EXTERN ShowWindow@8:near
EXTERN TranslateMessage@4:near
EXTERN UpdateWindow@4:near
EXTERN LoadCursorA@8:NEAR
EXTERN LoadIconA@8:NEAR

includelib lib\kernel32.lib
includelib lib\user32.lib

wndclass struc
classstyle dd ?
clwndproc dd ?
clscextra dd ?
clwndextra dd ?
clshinstance dd ?
clshicon dd ?
clshcursor dd ?
clbground dd ?
clmenuname dd ?
clname dd ?
wndclass ends

msgs struc
mshwnd dd ?
msmessage dd ?
mswparam dd ?
mslparam dd ?
mstime dd ?
mspt dd ?
msgs ends

.data
classname db 'ASMCLASS32',0
titlename db 'win win win hehehe',0
hinst dd 0
wc wndclass <?>
nhwnd dd 0
msg msgs <?>
cap db 'message!',0
textmess db 'r button!',0
textmess2 db 'CREATE!!!!',0

; -------------------------------------------------------------------------
.code
START:
push 0
call GetModuleHandleA@4
mov [hinst],eax

mov [wc.classstyle],4003h
mov [wc.clwndproc],offset wndproc
mov [wc.clscextra],0
mov [wc.clwndextra],0
mov eax,[hinst]
mov [wc.clshinstance],eax

push 32512
push 0
call LoadIconA@8

mov wc.clshicon,eax

push 32512
push 0
call LoadCursorA@8

mov wc.clshcursor,eax

mov wc.clbground,5
mov wc.clmenuname,0
mov wc.clname,offset classname
push offset wc
call RegisterClassA@4

push 0
push [hinst]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0CF0000h
push offset titlename
push offset classname
push 0
call CreateWindowExA@48

mov [nhwnd],eax

push 1
push [nhwnd]
call ShowWindow@8

push [nhwnd]
call UpdateWindow@4

msg_loop:
push 0
push 0
push 0
push offset msg
call GetMessageA@16
cmp ax,0
jz end_loop
push offset msg
call TranslateMessage@4
push offset msg
call DispatchMessageA@4
jmp msg_loop
end_loop:
push 0
call ExitProcess@4
; -------------------------------------------------------------------------
wndproc proc
push ebp
mov ebp,esp
push ebx
push esi
push edi

cmp dword ptr [ebp+0Ch],2h
jz wmdestroy

cmp dword ptr [ebp+0Ch],1h
jz wmcreate

cmp dword ptr [ebp+0Ch],204
jz wmrbutton

push dword ptr [ebp+14h]
push dword ptr [ebp+10h]
push dword ptr [ebp+0Ch]
push dword ptr [ebp+08h]
call DefWindowProcA@16
mov eax,0
jmp finish

wmcreate:
push offset cap
push offset textmess2
call mess
mov eax,0
jmp finish
wmrbutton:
push offset cap
push offset textmess
call mess
mov eax,0
jmp finish
wmdestroy:
push 0
call PostQuitMessage@4
mov eax,0
finish:
pop edi
pop esi
pop ebx
pop ebp
ret 16
wndproc endp




mess proc
push ebp
mov ebp,esp
push 0
push dword ptr [ebp+12]
push dword ptr [ebp+8]
push 0
call MessageBoxA@16
mov esp,ebp
pop ebx
ret 8
mess endp

END START
Он всего-то и делает, что создаёт окно, ну и пара обработок сообщений. Но вот проблема - функция сознания окна CreateWindowExA постоянно в ЕАХ возвращает 0, то бишь происходит ошибка - смотрел в отладчике. Не хочет создавать окно... В чём моя ошибка? Почему код не работатет? Всем Спасибо за ответы! ++++

Огромная просьба не давать ссылки на рабочие примеры. У меня они есть, но почему-то они работают, а мой код - нет... даже незнаю почему - в отладчике почти 1 в 1 ....

Последний раз редактировалось Girsoft; 04.02.2009 в 11:40..
 
Ответить с цитированием