Доброго времени суток, уважаемые. Интересует такой вопрос. Как в FASMe при компиляции добавить к файлу информацию о версии, авторе и т.д. + иконку. Благодарю за внимание.
Смотрю http://flatassembler.net/docs.php?article=manual не могу найти такой раздел... что за мануал у вас?
Можно так: Код (Text): format PE GUI 4.0 entry start include 'win32a.inc' section '.data' data readable writeable cpt db 'Hello!',0 msg db 'World',0 section '.code' code readable executable start: invoke MessageBox,HWND_DESKTOP,cpt,msg,MB_OK invoke ExitProcess,0 ret section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include 'api\kernel32.inc' include 'api\user32.inc' section '.rsrc' resource data readable directory RT_ICON,icons,\ RT_GROUP_ICON,group_icons,\ RT_VERSION,versions resource icons,\ 1,LANG_NEUTRAL,icon_data resource group_icons,\ 17,LANG_NEUTRAL,main_icon resource versions,\ 1,LANG_NEUTRAL,version icon main_icon,icon_data,'1.ico' versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\ 'FileDescription','Hello World - example program',\ 'LegalCopyright','©Microsoft Corporation. No rights reserved.',\ 'CompanyName','Microsoft Corporation',\ 'ProductName','Hello World',\ 'FileVersion','1.0',\ 'ProductVersion','1.0',\ 'OriginalFilename','HELLO.EXE' но имхо проще отдельно ресурсы компилировать. Мануал идёт в комплекте с компилятором.
А у меня такой вопрос: в каждой проге надо писать в конце импорт библиотек и функций win api. Можно это как то автоматизировать? А то это может и пол часа занять. Я вот про что говорю: Код (Text): section '.idata' import data readable writeable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ GDI32, 'GDI32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ ShowWindow, 'ShowWindow',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ BeginPaint, 'BeginPaint',\ InvalidateRect, 'InvalidateRect',\ EndPaint, 'EndPaint',\ GetMessage, 'GetMessageA',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import GDI32,\ TextOut, 'TextOutA'
можно так Код (Text): section '.idata' import data readable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\KERNEL32.INC' include '%fasminc%\APIA\USER32.INC'
При использовании win32ax.inc можно и в масмовском стиле: Код (Text): start: ;=entry label ... .end start ;создает секцию импорта
Ещё можно заюзать Vortex's scan Перед ассемблированием: scan.exe source.asm -f -o:idata.inc Scan находит все "invoke", "cinvoke" и создаёт файл idata.inc, в который прописывает весь импорт. Для инклудов, сканить которые на наличие импорта не нужно, можно поставить коммент ;*
я юзаю макрос Код (Text): macro USED [name,list] { common section '.idata' import data readable writeable forward dd 0,0,0,RVA name#_str,RVA name#_table common dd 0,0,0,0,0 forward name#_str db `name#".DLL",0 forward name#_table: irp label,list \{label dd RVA label\#_str \} dd 0 irp label,list \{label\#_str db 0,0,\`label,0 \} } Код (Text): USED KERNEL32,<GetModuleHandleA,ExitProcess>,\ USER32,<RegisterClassA,CreateWindowExA,...>,\ ...
Еще интересный вариант: Код (Text): section '.idata' import data readable writeable macro import lib,[functions] { common macro import_#lib \{ import lib,functions \} } macro api [functions] { common macro all_api \{ all_api api functions \} } macro all_api {} include '..\..\include\api/kernel32.inc' include '..\..\include\api/user32.inc' include '..\..\include\api/gdi32.inc' include '..\..\include\api/advapi32.inc' include '..\..\include\api/comctl32.inc' include '..\..\include\api/comdlg32.inc' include '..\..\include\api/shell32.inc' include '..\..\include\api/wsock32.inc' purge import,api library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ gdi32,'GDI32.DLL',\ advapi32,'ADVAPI32.DLL',\ comctl32,'COMCTL32.DLL',\ comdlg32,'COMDLG32.DLL',\ shell32,'SHELL32.DLL',\ wsock32,'WSOCK32.DLL' import_kernel32 import_user32 import_gdi32 import_advapi32 import_comctl32 import_comdlg32 import_shell32 import_wsock32 all_api И впихнуть это дело в файл к примеру Win32Api.inc и в каждый проект инклюдировать.
Народ помогите пожалуйста. Вот код программы (сам писал): Код (Text): format PE GUI entry start include 'include\win32a.inc' section 'data' data readable writeable _mHandle dd ? _iHandle dd ? _cHandle dd ? _wHandle dd ? _wc WNDCLASS _msg MSG _cName TCHAR 'MyClass',0 _wName TCHAR 'My Window :D',0 section 'code' code readable executable start: ;===== берём хендлы всего что пригодится ===== invoke GetModuleHandle, 0 mov [_mHandle], eax invoke LoadIcon, 0, IDI_APPLICATION mov [_iHandle], eax invoke LoadCursor, 0, IDC_ARROW mov [_cHandle], eax ;===== регистрируем класс ===== mov [_wc.style], CS_HREDRAW+CS_VREDRAW mov [_wc.lpfnWndProc], WindowProcess mov [_wc.cbClsExtra], 0 mov [_wc.cbWndExtra], 0 mov [_wc.hInstance], _mHandle mov [_wc.hIcon], _iHandle mov [_wc.hCursor], _cHandle mov [_wc.hbrBackground], COLOR_WINDOW mov [_wc.lpszMenuName], 0 mov [_wc.lpszClassName], _cName invoke RegisterClass, _wc ;===== создаём окно ===== invoke CreateWindowEx, 0, _cName, _wName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, _mHandle, 0 mov [_wHandle], eax ;===== показываем и обновляем ===== invoke ShowWindow, _wHandle, SW_NORMAL invoke UpdateWindow, _wHandle ;===== бесконечный цикл ===== .LOL: invoke GetMessage, _msg, 0, 0, 0 cmp eax, 0 je .exit invoke TranslateMessage, _msg invoke DispatchMessage, _msg jmp .LOL .exit: invoke ExitProcess, [_msg.wParam] proc WindowProcess wHandle, msg, wparam, lparam cmp [msg], WM_DESTROY je .destroy invoke DefWindowProc, [wHandle], [msg], [wparam], [lparam] ret .destroy: invoke PostQuitMessage, 0 endp section 'idata' import data readable library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL', gdi32, 'GDI32.DLL' include 'include\api\kernel32.inc' include 'include\api\user32.inc' include 'include\api\gdi32.inc' Собственно в чём проблема: пишет ошибку. Помогите пожалуйста найти ошибку в коде, а то я первый день кожу на фасме Заранее спасибо!
На вскидку - ret нужен Код (Text): invoke PostQuitMessage, 0 ret endp Насколько я понял, процедура считается только до 1го ret'а Поэтому в фасме лучше писать так: Код (Text): proc WindowProcess wHandle, msg, wparam, lparam cmp [msg], WM_DESTROY je .destroy invoke DefWindowProc, [wHandle], [msg], [wparam], [lparam] jmp @ret .destroy: invoke PostQuitMessage, 0 @ret: ret endp Это необходимо по многим причинам, например для правильного восстановления стека.
Loginanton Какие сообщения об ошибках появляются? Я просто скопировал твой пример, он компилируется без ошибок, только со стеком были проблемы, где указал. Ошибка вознакает на ??
error: write failed Код (Text): format PE GUI entry start include 'include\win32a.inc' section 'data' data readable writeable _mHandle dd ? _iHandle dd ? _cHandle dd ? _wHandle dd ? _wc WNDCLASS _msg MSG _cName TCHAR 'MyClass',0 _wName TCHAR 'My Window :D',0 section 'code' code readable executable start: ;===== берём хендлы всего что пригодится ===== invoke GetModuleHandle, 0 mov [_mHandle], eax invoke LoadIcon, 0, IDI_APPLICATION mov [_iHandle], eax invoke LoadCursor, 0, IDC_ARROW mov [_cHandle], eax ;===== регистрируем класс ===== mov [_wc.style], CS_HREDRAW+CS_VREDRAW mov [_wc.lpfnWndProc], WindowProcess mov [_wc.cbClsExtra], 0 mov [_wc.cbWndExtra], 0 mov [_wc.hInstance], _mHandle mov [_wc.hIcon], _iHandle mov [_wc.hCursor], _cHandle mov [_wc.hbrBackground], COLOR_WINDOW mov [_wc.lpszMenuName], 0 mov [_wc.lpszClassName], _cName invoke RegisterClass, _wc ;===== создаём окно ===== invoke CreateWindowEx, 0, _cName, _wName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, [_mHandle], 0 mov [_wHandle], eax ;===== показываем и обновляем ===== invoke ShowWindow, [_wHandle], SW_SHOW invoke UpdateWindow, [_wHandle] ;===== бесконечный цикл ===== .LOL: invoke GetMessage, _msg, 0, 0, 0 cmp eax, 0 je .exit invoke TranslateMessage, _msg invoke DispatchMessage, _msg jmp .LOL .exit: invoke ExitProcess, [_msg.wParam] proc WindowProcess wHandle, msg, wparam, lparam cmp [msg], WM_DESTROY je .destroy invoke DefWindowProc, [wHandle], [msg], [wparam], [lparam] jmp @ret .destroy: invoke PostQuitMessage, 0 @ret: ret endp section 'idata' import data readable library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL', gdi32, 'GDI32.DLL' include 'include\api\kernel32.inc' include 'include\api\user32.inc' include 'include\api\gdi32.inc'
Это значит что fasm не может записать в exe файл данные. Т.е. этот exe в памяти висит. Ctrl+Alt+Del и убей процесс.
twgt точняк а я пытался после того как убил несколько прахов, висящих в памяти, просто запустить prax.exe снова Спасибо большое за помощь! P.S. прога действительно работает! Правда с курсором чё то не то А вот такой вопрос: будет ли разница между Код (Text): _wName TCHAR 'My Window :D',0 и Код (Text): _wName db 'My Window :D',0