Помогите с ассемблером

Скопировал программы из уроков Iczelion 10- "диалоговое окно как основное". Ассемблирую в masm32. Первая зависает, вторая закрывается, но окно не появляется в обоих случаях. Помогите, пожалуйста, какая может быть ошибка?

И где можно найти учебник/туториал/пример, чтобы сделать приложение из одного окна для ввода чисел/ьекста и второго – для вывода текста и графики (примитивы)?

1
Автор поста оценил этот комментарий
.386
.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
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Всё, заработало, но это одно окно. Вопрос именно про несколько.

0
Автор поста оценил этот комментарий

Исправил все проблемы при компиляции, сассемблировал, и та же проблема, что и в посте.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Хотя при отладке останавливается на другой команде.

1
Автор поста оценил этот комментарий
.386
.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
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Исправил все проблемы при компиляции, сассемблировал, и та же проблема, что и в посте.

показать ответы
1
Автор поста оценил этот комментарий
.386
.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
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

перед инклюдами WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

LOCAL buffer[256]:BYTE поднял под строку WndProc proc

осталось решить проблемы INVOKE argument type mismatch : argument : 2 и проблемы constant value too large. Собственно, это, должно быт, addr "STATIC" и addr "EDIT" вызывают.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества