Помогите с ассемблером
Скопировал программы из уроков Iczelion 10- "диалоговое окно как основное". Ассемблирую в masm32. Первая зависает, вторая закрывается, но окно не появляется в обоих случаях. Помогите, пожалуйста, какая может быть ошибка?
И где можно найти учебник/туториал/пример, чтобы сделать приложение из одного окна для ввода чисел/ьекста и второго – для вывода текста и графики (примитивы)?
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
szClassName db "TextWindowClass",0
szAppName db "Text Input/Output App",0
szInputLabel db "Введите текст:",0
szOutputLabel db "Результат:",0
szButtonText db "Обработать",0
hInstance dd 0
hInputEdit dd 0
hOutputEdit dd 0
hButton dd 0
.data?
hWnd dd ?
CommandLine dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
mov eax, hInst
mov wc.hInstance, eax
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx, 0, addr szClassName, addr szAppName,\
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,\
400, 300, NULL, NULL, hInst, NULL
mov hWnd, eax
invoke ShowWindow, hWnd, SW_SHOWNORMAL
invoke UpdateWindow, hWnd
.WHILE TRUE
invoke GetMessage, addr msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWin:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg == WM_CREATE
; Создаем метку для поля ввода
invoke CreateWindowEx, 0, addr "STATIC", addr szInputLabel,\
WS_CHILD or WS_VISIBLE or SS_LEFT,\
10, 10, 150, 20, hWin, NULL, hInstance, NULL
; Создаем поле ввода
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr "EDIT", NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_AUTOHSCROLL,\
10, 30, 350, 25, hWin, 100, hInstance, NULL
mov hInputEdit, eax
; Создаем метку для поля вывода
invoke CreateWindowEx, 0, addr "STATIC", addr szOutputLabel,\
WS_CHILD or WS_VISIBLE or SS_LEFT,\
10, 70, 150, 20, hWin, NULL, hInstance, NULL
; Создаем поле вывода (только для чтения)
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr "EDIT", NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_READONLY,\
10, 90, 350, 25, hWin, 101, hInstance, NULL
mov hOutputEdit, eax
; Создаем кнопку
invoke CreateWindowEx, 0, addr "BUTTON", addr szButtonText,\
WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,\
150, 130, 100, 30, hWin, 102, hInstance, NULL
mov hButton, eax
.ELSEIF uMsg == WM_COMMAND
mov eax, wParam
.IF ax == 102 ; Нажата кнопка
shr eax, 16
.IF ax == BN_CLICKED
; Получаем текст из поля ввода
LOCAL buffer[256]:BYTE
invoke GetWindowText, hInputEdit, addr buffer, sizeof buffer
; Здесь можно добавить обработку текста
; Например, преобразовать в верхний регистр
invoke CharUpper, addr buffer
; Устанавливаем текст в поле вывода
invoke SetWindowText, hOutputEdit, addr buffer
.ENDIF
.ENDIF
.ELSEIF uMsg == WM_DESTROY
invoke PostQuitMessage, 0
.ELSE
invoke DefWindowProc, hWin, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
end start