Консультация № 171618
26.08.2009, 06:16
0.00 руб.
0 3 1
Здравствуйте уважаемые эксперты !
Найдите ошибку в примере и исправьте, прога компилируется, но не работает, просто висит в процессах.
компилятор FASM

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

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

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

ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
char dd 20h

hInstance dd ?
hMainWindow dd ?
;hFount dd ?

msg MSG

wc WNDCLASS

;rect RECT




;--------------------------------------
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],CS_HREDRAW or CS_VREDRAW
mov [wc.lpfnWndProc],WindowProc

mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0

mov eax,[hInstance]

mov [wc.hInstance],eax

mov [wc.hbrBackground],COLOR_WINDOW+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],ClassName
invoke RegisterClassEx,wc

invoke CreateWindowEx,0,\
ClassName,\
AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
0,\
0,\
[hInstance],0

mov [hMainWindow],eax

invoke ShowWindow, [hMainWindow],SW_SHOWNORMAL
;invoke UpdateWindow,[hMainWindow]

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
local ps:PAINTSTRUCT, hdc:DWORD ;локальные переменные

cmp [wmsg],WM_DESTROY
je wmdestroy
cmp [wmsg],WM_CHAR
je invalid
jmp paint
invalid:
push [msg.wParam]
pop [char]
invoke InvalidateRect,[hMainWindow],0,TRUE
paint:
cmp [wmsg],WM_PAINT
je beginP

jmp defwndproc

beginP:
lea eax,[ps]
invoke BeginPaint,[hwnd],eax
mov [hdc],eax
invoke TextOut,[hdc],0,0,char,1
invoke EndPaint,[hwnd],[ps]

jmp defwndproc

wmdestroy:
invoke PostQuitMessage,0
xor eax,eax
jmp finish

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

finish:
pop edi esi ebx
ret
endp

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

library kernel,'KERNEL32.DLL',\
user,'USER32.DLL',\
gdi,'gdi32.dll'

;include 'c:\fasm\INCLUDE\api\kernel32.inc'
;include 'c:\fasm\INCLUDE\api\user32.inc'
;include 'c:\fasm\INCLUDE\api\gdi32.inc'

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

import user,\
ShowWindow,'ShowWindow',\
InvalidateRect,'InvalidateRect',\
BeginPaint,'BeginPaint',\
EndPaint,'EndPaint',\
GetClientRect,'GetClientRect',\
RegisterClassEx,'RegisterClassExA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage'


import gdi,\
CreateFont,'CreateFontA',\
SetBkColor,'SetBkColor',\
TextOut,'TextOutA',\
SelectObject,'SelectObject',\
SetTextColor,'SetTextColor',\
DrawText,'DrawTextA'

Обсуждение

Неизвестный
26.08.2009, 08:47
общий
это ответ
Здравствуйте, WWWorm.
читаем msdn

RegisterClass структура WNDCLASS
typedef struct {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;

RegisterClassEx структура WNDCLASSEX
typedef struct {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
5
Неизвестный
26.08.2009, 08:54
общий
исправить
Код:
wc WNDCLASSEX

добавить
Код:
invoke LoadIcon, 0,IDI_APPLICATION
mov [wc.hIcon],eax
mov [wc.hIconSm],eax
mov [wc.cbSize],sizeof.WNDCLASSEX
Неизвестный
26.08.2009, 09:17
общий
О, все заработало, спасибо!
Форма ответа