ProMiNick
Joined: 24 Mar 2012
Posts: 802
Location: Russian Federation, Sochi
|
I tryed to port examples from fasm1 to fasmg, from old resource sintax to new one (and at same time to test my understanding of resource internals)/
I don`t looking for macro that does it correctly. I wish to write that macro myself. I need just to know where I make mistake?
;include 'FUNDAMENTALS\MACROS\symbols.inc'
include 'ABI\WIN\win32a.inc'
format PE GUI ;rename binary as 'MINIPAD.EXE'
entry start ;launch CMD line '%OUTPUT%'
IDR_ICON = 1
IDR_GICON = 17
IDR_MENU = 37
IDM_NEW = 101
IDM_EXIT = 102
IDM_ABOUT = 901
NULL = 0
FALSE = 0
TRUE = 1
section '.text' code readable executable
start:
invoke GetModuleHandle,0
mov [wc.hInstance],eax
invoke LoadIcon,eax,IDR_ICON
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc
test eax,eax
jz error
invoke LoadMenu,[wc.hInstance],IDR_MENU
invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW,144,128,256,256,NULL,eax,[wc.hInstance],NULL
test eax,eax
jz error
msg_loop:
invoke GetMessage,msg,NULL,0,0
cmp eax,1
jb end_loop
jne msg_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
error:
invoke MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
end_loop:
invoke ExitProcess,0
proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
mov eax,[wmsg]
cmp eax,WM_CREATE
je .wmcreate
cmp eax,WM_SIZE
je .wmsize
cmp eax,WM_SETFOCUS
je .wmsetfocus
cmp eax,WM_COMMAND
je .wmcommand
cmp eax,WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp .finish
.wmcreate:
invoke GetClientRect,[hwnd],client
invoke CreateWindowEx,WS_EX_CLIENTEDGE,_edit,0,WS_VISIBLE+WS_CHILD+WS_HSCROLL+WS_VSCROLL+ES_AUTOHSCROLL+ES_AUTOVSCROLL+ES_MULTILINE,[client.left],[client.top],[client.right],[client.bottom],[hwnd],0,[wc.hInstance],NULL
or eax,eax
jz .failed
mov [edithwnd],eax
invoke CreateFont,16,0,0,0,0,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_RASTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH+FF_DONTCARE,NULL
or eax,eax
jz .failed
mov [editfont],eax
invoke SendMessage,[edithwnd],WM_SETFONT,eax,FALSE
xor eax,eax
jmp .finish
.failed:
or eax,-1
jmp .finish
.wmsize:
invoke GetClientRect,[hwnd],client
invoke MoveWindow,[edithwnd],[client.left],[client.top],[client.right],[client.bottom],TRUE
xor eax,eax
jmp .finish
.wmsetfocus:
invoke SetFocus,[edithwnd]
xor eax,eax
jmp .finish
.wmcommand:
mov eax,[wparam]
and eax,0FFFFh
cmp eax,IDM_NEW
je .new
cmp eax,IDM_ABOUT
je .about
cmp eax,IDM_EXIT
je .wmdestroy
jmp .defwndproc
.new:
invoke SendMessage,[edithwnd],WM_SETTEXT,0,0
jmp .finish
.about:
invoke MessageBox,[hwnd],_about_text,_about_title,MB_OK
jmp .finish
.wmdestroy:
invoke DeleteObject,[editfont]
invoke PostQuitMessage,0
xor eax,eax
.finish:
ret
endp
section '.data' data readable writeable
_title TCHAR 'MiniPad',0
_about_title TCHAR 'About MiniPad',0
_about_text TCHAR 'This is Win32 example program created with flat assembler.',0
_error TCHAR 'Startup failed.',0
_class TCHAR 'MINIPAD32',0
_edit TCHAR 'EDIT',0
wc WNDCLASS style:0, lpfnWndProc:WindowProc, hbrBackground:COLOR_BTNFACE+1, lpszClassName:_class
edithwnd dd ?
editfont dd ?
msg MSG
client RECT
section '.idata' import data readable writeable
;dd 0,0,0,RVA kernel_name,RVA kernel_table
;dd 0,0,0,RVA user_name,RVA user_table
;dd 0,0,0,0,0
;kernel_table:
; ExitProcess dd RVA _ExitProcess
; dd 0
;user_table:
; MessageBox dd RVA _MessageBoxA
; dd 0
;kernel_name db 'KERNEL32.DLL',0
;user_name db 'USER32.DLL',0
;_ExitProcess dw 0
; db 'ExitProcess',0
;_MessageBoxA dw 0
; db 'MessageBoxA',0
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
gdi32,'GDI32.DLL'
include 'ABI\WIN\API\kernel32.inc'
include 'ABI\WIN\API\user32.inc'
include 'ABI\WIN\API\gdi32.inc'
section '.reloc' fixups data readable discardable ; needed for Win32s
macro menuitem string,id,resinfo,status,type
dd MFT_STRING or type+0,status+0,id
dw resinfo+0
du string,0
align 4
match any,resinfo
if resinfo and MFR_POPUP
dd 0
end if
end match
end macro
macro menuseparator resinfo
dd MFT_SEPARATOR,0,0
dw resinfo+0,0
end macro
section '.rsrc' resource data readable
resource_directory
resource_data RT_MENU,IDR_MENU,LANG_ENGLISH+SUBLANG_DEFAULT
dw 1,4,0,0
menuitem '&File',0,MFR_POPUP
menuitem '&New',IDM_NEW
menuseparator
menuitem 'E&xit',IDM_EXIT,MFR_END
menuitem '&Help',0,MFR_POPUP + MFR_END
menuitem '&About...',IDM_ABOUT,MFR_END
end resource_data
resource_data RT_ICON,IDR_ICON,LANG_NEUTRAL
virtual at 0
file 'minipad.ico':6,16
load size:dword from 8
load position:dword from 12
end virtual
file 'minipad.ico':position,size
end resource_data
resource_data RT_GROUP_ICON,IDR_GICON,LANG_NEUTRAL
dw 0,1,1
file 'minipad.ico':6,12
dw IDR_ICON
end resource_data
end resource_directory
menu goes correctly, app not crashed, even in explorer icon of app displayed correctly in explorer and in taskbar, but....
..Icon not goes to window header. I can`t localize mistake: it is in resources or in code? upper picture - how window header looks after compile from fasm1 examples, down picture is mine in fasmg with mistake.
I tryed to see difference in tool of MiTek named exe.exe (freeware) in both "minipad.exe"`s present same resources for icon, menu, group icon - they looks binary identic on first sight.
Description: |
|
Filesize: |
1.65 KB |
Viewed: |
4251 Time(s) |
|
|
Description: |
|
Filesize: |
7.86 KB |
Viewed: |
4251 Time(s) |
|
|
_________________ I don`t like to refer by "you" to one person.
My soul requires acronim "thou" instead.
Last edited by ProMiNick on 24 Jul 2017, 21:40; edited 1 time in total
|