Консультация № 171429
17.08.2009, 17:23
0.00 руб.
0 5 2
Здравствуйте уважаемые эксперты ! Найдите ошибку в примере, ну и исправьте не могу понять, в чем причина!!!
вероятно, что ошибка кроится в строке: proc WindowProc, hwnd,wmsg,wparam,lparam
компилятор FASM!!!

Приложение:
;примерчик
format pe gui 4.0
entry start

include 'c:\fasm\include\win32w.inc'


section '.data'data readable writeable

ClassName db "SimpleWinClass",0
AppName db "Our First Window",0

hInstance dd ?
CommandLine dd ?

msg MSG

wc WNDCLASS

section '.code'code readable executable

start:

invoke GetModuleHandle,0
mov [hinstance],eax

invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
mov [wc.srule],0
mov [wc.lpfnWndProc],WindowProc

mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[hinstance]
mov [wc.hinstance],eax
mov [wc.hbrBackground],COLOR_BTNFACE+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],ourClass
invoke RegisterClass,wc

invoke CreateWindowsEx,0,\
ClassName,\
AppName,\
WS_VISIBLE_WS_DLGFRAME+WS_SYSMENU,\
128,\
128,\
192,\
192,\
0,\
0,\
[hinstance],0

mov [ComandLine],eax

msg_loop:
invoke GetMesage,msg,0,0,0

or eax,eax
jz end_loop
invoke TranslateMessage,msg
jmp msg_loop

end_loop:
invoke ExitProcess,[msg.wParam]
proc WindowProc, hwnd,wmsg,wparam,lparam ;выводит что здесь ошибкааааа!!!
enter
push ebx esi edi
cmp [wmsg],WM_DESTROY
je wmdestroy
defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmdestroy:
invoke PostQuitMessage,0

xor eax,eax
finish:
pop edi esi ebx
return

section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'

import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'

import user,\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
WindowProc,'WindowProc'
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage'

Обсуждение

Неизвестный
17.08.2009, 18:18
общий
это ответ
Здравствуйте, WWWorm.

В примере много опечаток.

Приложение:
;примерчик
format pe gui 4.0
entry start

include 'c:\fasm\include\win32w.inc'

section '.data'data readable writeable

ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
hInstance dd ?
CommandLine dd ?


msg MSG
wc WNDCLASS

section '.code'code readable executable

start:

invoke GetModuleHandle,0
mov [hInstance],eax ;!!!

invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
mov [wc.style],0
mov [wc.lpfnWndProc],WindowProc

mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[hInstance]
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_BTNFACE+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],ClassName ;!!!
invoke RegisterClass,wc

test eax,eax
jz end_loop

invoke CreateWindowEx,0,\ ;!!!
ClassName,\
AppName,\
WS_VISIBLE + WS_DLGFRAME + WS_SYSMENU,\ ;!!!
128,\
128,\
192,\
192,\
0,\
0,\
[hInstance],0

test eax,eax
jz end_loop

mov [CommandLine],eax ;???

msg_loop:
invoke GetMessage,msg,0,0,0 ;!!!

or eax,eax
jz end_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg ;!!!
jmp msg_loop

end_loop:
invoke ExitProcess,[msg.wParam]

proc WindowProc hwnd,wmsg,wparam,lparam ;выводит что здесь ошибкааааа!!! ;!!!
; enter ;!!!
push ebx esi edi
cmp [wmsg],WM_DESTROY
je wmdestroy
defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmdestroy:
invoke PostQuitMessage,0

xor eax,eax
finish:
pop edi esi ebx
; return ;!!!
ret ;!!!
endp

section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'

import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'

import user,\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\ ;!!!
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage'
5
давно
Старший Модератор
31795
6196
17.08.2009, 18:19
общий
WWWorm:
Код:
proc WindowProc, hwnd,wmsg,wparam,lparam ;выводит что здесь ошибкааааа!!!
enter
. . .
return
endp
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.08.2009, 18:43
общий
вот спасибо ,QDSota!!!! вы мне реально помогли!!!
Неизвестный
17.08.2009, 18:46
общий
это ответ
Здравствуйте, WWWorm.

будьте внимательнее, у вас много опечаток в тексте
компилятор FASM различает регистр символов
забыли вызвать DispatchMessage в цикле обработки сообщений(эта функция будет вызывать вашу WindowProc, поэтому оконная функция имеет статус CALLBACK)
директива proc должна закрываться директивой endp
пролог и эпилог (enter, leave) подпрограмм компилятор создаст автоматически;
точнее вместо enter он создает
push ebp
mov ebp,esp
также не совсем понятно почему описатель окна вы назвали CommandLine

Приложение:
format pe gui 4.0
entry start

include 'C:\fasm\INCLUDE\win32w.inc'


;--------------------------------------
section '.data' data readable writeable

ClassName db "SimpleWinClass",0
AppName db "Our First Window",0

hInstance dd ?
CommandLine dd ?

msg MSG

wc WNDCLASS

;--------------------------------------
section '.code'code readable executable

start:

invoke GetModuleHandle,0
mov [hInstance],eax

invoke LoadIcon, 0,IDI_APPLICATION
mov [wc.hIcon],eax

invoke LoadCursor, 0,IDC_ARROW
mov [wc.hCursor],eax

mov [wc.style],0
mov [wc.lpfnWndProc],WindowProc

mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[hInstance]
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_BTNFACE+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],ClassName
invoke RegisterClass,wc

invoke CreateWindowEx,0,\
ClassName,\
AppName,\
WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,\
128,\
128,\
192,\
192,\
0,\
0,\
[hInstance],0

mov [CommandLine],eax

msg_loop:
invoke GetMessage,msg,0,0,0
or eax,eax
jz end_loop

invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop

end_loop:
invoke ExitProcess,[msg.wParam]


proc WindowProc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
push ebx esi edi
cmp [wmsg],WM_DESTROY
je wmdestroy

defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish

wmdestroy:
invoke PostQuitMessage,0
xor eax,eax

finish:
pop edi esi ebx
ret
endp

;----------------------------------------------
section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'

import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'

import user,\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage'
5
Неизвестный
17.08.2009, 18:53
общий
и вам Alex_S с Константин Николаевичом СПАСИБО!!!!!!!
Форма ответа