Loginanton masm прекрасно это компилит. Вот только линкер не может найти _MessageBox@16 Замени в двух местах на MessageBoxA и будет тебе счастье.
valterg о спасиб тока почему то он ошибку выдаёт при запуске скомпилированной проги Это только у меня?
Loginanton почему то он ошибку выдаёт при запуске скомпилированной проги ... надо данные запихнуть в .data Запусти в отладчике, например, olly, и посмотри на код, который получает управление, когда $Title и $Text в секци .code и когда они в секции .data.
Loginanton Потому что у тебя указана точка входа start и за ней идут данные. Нужно было либо jmp поставить, либо задать вход там, где команды, либо данные поставить после call ExitProcess
DEEP, если у тебя будет время пожалуйста расскажи поподробнее о функции CreateWindowEx. И приведи пример проги, где использовалась бы только эта функция и ExitProcess. А то я запутался в коде третей части
Она создает окно с расширенными атрибутами. Без демонстрации свойств этих атрибутов она эквивалентна CreateWindow - стало быть пример, который ты хочешь, не имеет смысла.
Вот есть пример: Код (Text): WNDCLASS STRUCT style DWORD ? lpfnWndProc DWORD ? cbClsExtra DWORD ? cbWndExtra DWORD ? hInstance DWORD ? hIcon DWORD ? hCursor DWORD ? hbrBackground DWORD ? lpszMenuName DWORD ? lpszClassName DWORD ? WNDCLASS ENDS .data wc WNDCLASS <> Можно ли этот кусок кода записать как нибудь по другому?
DEEP Код (Text): format PE GUI include 'win32ax.inc' ; import data in the same section xor ebx,ebx mov edi,wTitle mov esi,400000h ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke RegisterClass,esp,ebx,window_procedure,ebx,\ ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi ; +--------------------------+ ; | creating the main window | ; +--------------------------+ push ebx push esi shl esi,9 invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\ esi,esi,esi,esi,ebx,ebx mov ebp,esp ; +---------------------------+ ; | entering the message loop | ; +---------------------------+ message_loop: invoke GetMessage,ebp,ebx,ebx,ebx invoke DispatchMessage,ebp jmp message_loop ; +----------------------+ ; | the window procedure | ; +----------------------+ window_procedure: cmp dword[esp+0x08],WM_DESTROY je wmDESTROY jmp dword [DefWindowProc] wmDESTROY: invoke ExitProcess,ebx wTitle db 'Iczelion Tutorial #3:A Simple Window in FASM',0 ;name of our window data import library KERNEL32, 'KERNEL32.DLL',\ user32, 'USER32.DLL' import KERNEL32,\ ExitProcess, 'ExitProcess' import user32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ GetMessage, 'GetMessageA',\ DispatchMessage, 'DispatchMessageA' end data
Так обычно и бывает, когда хочешь действительно разобраться в вопросе. Это хороший метод: дабы убедиться, что понял, - попробуй изложить на бумаге. Чтобы потом не спешить называть написанное статьей, а сначала самому критически изучить собственный текст. Но, кажется, этот важнейший этап вами пропущен. Куча ошибок. Конечно, у Iczelion-а тоже есть ошибки, но вы все-таки пишете после него (Впрочем, допускаю, что крутой педагог Iczelion просто по-хитрому стимулировал изучающих, ну, типа как инструктор на занятиях: "Внимание, ввожу неисправность" ) Пожалуйста, вот темы для разбора (бегло, что бросается в глаза): - WNDCLASS/WNDCLASSEX, RegisterClass/RegisterClassEx (не различаете), - db/equ (что тут изменяется/не изменяется, а?), - "CS_HREDRAW – Окно в случае перемещения/изменения размера по горизонтали должно перерисоваться" (window/client area), - "WS_EX_MDICHILD: необходим для создания MDI-приложений (окно полностью находится в окне-"предке"), - "WS_CLIPSIBLINGS: из области перерисовки исключаются все окна того же класса" - "WS_MAXIMIZEBOX: в заголовок добавляется []. Употребимо только с WS_SYSMENU" (с чего вы взяли?) P.S. А не замахнуться ли на WinAPI+GUI в комиксе? (почти не шучу)
Mikl__ А можешь выложить кусок кода как подругому записывать, а то у меня почему то все архивы в той ветви битые
> kero Ну вот, первый кирпич на голову Эх, зря выкладывал... А всё что находится в моей недостатье, получено мною без уроков Iczelion'a (и кого-л. другого), чисто на основании опыта. Когда-то давно, я два дня потратил на создание чёртовой тучи окон с разными парамами и записывал их действие на внешний вид етих окон. Видимо, то ли не все варианты перебрал, то ли от усталости глаз замылился В общем, чукча более не писатель... второй кирпич. Вот блин, поспешил я что называется явить миру свою "мудрость"...
DEEP Ну почему же? Совместно придти к наиболее полной и корректной версии статей - это же гораздо полезнее, чем написать еще один цикл статей с авторским видением проблемы. В RadASM удобно проводить подобные махинации в редакторе ресурсов (набор checkbox'ов для смены флагов битовых полей стилей). В свое время весьма интересно провел час-другой, перебирая варианты.
Код проги: Код (Text): .386 .model flat, stdcall option casemap: none ;========== includelib masm32\lib\kernel32.lib includelib masm32\lib\user32.lib includelib masm32\lib\gdi32.lib ;========== GetModuleHandleA proto :dword LoadIcon proto :dword LoadCursor proto :dword RegisterClassEx proto :dword ExitProcess proto :dword ;========== .data ClassName db "LOL",0 .data? Handle dword ? ; тут будет хранится хендл проги ForClass struct dword ; тут будет будет хранится инфа для создания класса cbSize dword ? style dword ? IpfnWndProc dword ? cbClsExtra dword ? hInstance dword ? hIcon dword ? hCursor dword ? nbrBackground dword ? IpszMenuName dword ? IpszClassName dword ? hIconSm dword ? ForClass ends .code ;========== start: push 0 call GetModuleHandleA mov Handle, eax mov ForClass.cbSize, sizeof dword mov ForClass.style, cs_hredraw or cs_vredraw mov ForClass.IpfnWndProc, offset WndProc mov ForClass.cbClsExtra, 0 mov ForClass.cbWndExtra, 0 push Handle pop ForClass.hInstance mov ForClass.hbrBackground, 0 mov ForClass.IpszMenuName, 0 mov ForClass.IpszClassName, offset ClassName push 0 call LoadIcon mov ForClass.hIcon, eax mov ForClass.hIconSm, eax push 0 call LoadCursor mov ForClass.hCursor, eax push ForClass call RegisterClassEx push 0 call ExitProcess end start Помогите пожалуйста найти ошибки