Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 263
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »
quirck
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1692
Дата выхода:20.04.2018, 14:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:55 / 18
Вопросов / ответов:1 / 1

Консультация # 193065: Здравствуйте! У меня возникли сложности с таким вопросом: Возвращаясь к взаимоотношениям С/С++ и ассемблера:
..
    call    CreateWindowExA@48       ;
...

Консультация # 193065:

Здравствуйте! У меня возникли сложности с таким вопросом:
Возвращаясь к взаимоотношениям С/С++ и ассемблера:

..
    call    CreateWindowExA@48       ;создали кнопку 
    mov	    HWNDBTN,EAX
..  
  wmcomnd:
;блок обработки событий кнопки 
    mov     EAX,HWNDBTN
    cmp     DWORD ptr [EBP+14h],EAX  ;если такой нет - exit
    jne	    exit
;-----------------
;GetDlgItemText(hWnd:HWND, IDC_KEY:HWNDBTN12, str:?, 15); -->получаем символ кнопки
;SetDlgItemText(hWnd:HWND, IDC_EDIT:HWNDEDT, str:?);      -->добавляем на дисплей
;-------------------------
;получаем символ с кнопки:                                          
    push  15
    push  0                  ;?
    push  HWNDBTN
    push  HWND               ;окно-родитель
    call  GetDlgItemTextA@4  ;unresolved external symbol _GetDlgItemTextA@4
;добавляем на дисплей:  
    push  0                  ;?
    push  HWNDEDT
    push  HWND 
    call  SetDlgItemTextA@4  ;неразрешённое внешнее имя (id) _SetDlgItemTextA@4
;--------------------------  
  noexit:
	mov	    EAX,0
	jmp	    finish

Этот код не работает. Почему - unresolved? Специально создал def-файлы с используемых dll-библиотек,
всё на месте.
В Win 32 API аргумент "str" трактуется:
-- в первом случае, как буфер для приёма текста
-- во втором случае, как строка (заканчивающаяся пустым символом)
В любом случае - это обращение к адресу. Только - к какому(-ким)?

Наиболее оптимальным видится такой вариант:
..
wndproc:
..
  wmcreate:
    ...
    call  CreateWindowExA@48      ;создали кнопку 
    mov	  HWNDBTN,EAX
    .if EAX==WM_COMMAND & ?==HWNDBTN               
      invoke GetDlgItemText,HWND,HWNDBTN,NULL,15 
      invoke SetDlgItemText,HWND,HWNDEDT,NULL      
    .endif
..

Kак мне связать событие конкретной кнопки с WM_COMMAND?

Дата отправки: 10.04.2018, 14:37
Вопрос задал: cupoma58 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, cupoma58!
Подправленный код из мини-форума. Под masm32.
Пришлось добавить стандартные include и lib от masm32, константы да переменные
Соответственно, пришлось переименовать поля структур.
Изменены функции для получения/записи текста контролов.

Код (Assembler) :: выделить код
;fenix.asm, арифмометр с
обработкой 2-х кнопок

	.386			;32-битный код
	.model flat, stdcall	;модель памяти и соглашение о вызове параметров
	option casemap :none	;различаем большие-малые буковки

; include files
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm

; libraries
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

STYLE	equ	CS_HREDRAW or CS_VREDRAW
STYLBTN	equ	WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON or WS_TABSTOP
STYLEDT	equ	WS_CHILD or WS_VISIBLE or WS_BORDER

	.data
TITLENAME	db	"fenix",0
CLASSNAME	db	"fenixClass",0
CPBUT12		db	"7",0
CPBUT14		db	"9",0
CPEDT		db	0
CLSBUTN		db	"button",0
CLSEDIT		db	"edit",0

	.data?
WC		WNDCLASSEX	<>
msg		MSG		<>
HINST		dd		?
HWNDBUT12	dd		?
HWNDBUT14	dd		?
HWNDEDT		dd		?
HWNDMAIN	dd		?
BUF		db		16 dup(?)

	.code 
go:
	push 0
	call GetModuleHandle ;получить дескриптор приложения
	mov [HINST],EAX
wndproc: ;заполняем структуру окна 
	mov [WC.cbSize],sizeof WNDCLASSEX
	mov [WC.style],STYLE ;стиль(здесь и далее-смотри fenix.inc)
	mov [WC.lpfnWndProc],offset winproc ;обрабатываем сообщения
	mov [WC.cbClsExtra],0
	mov [WC.cbWndExtra],0
	mov EAX, [HINST]
	mov [WC.hInstance],EAX
	push IDI_APPLICATION ;иконка окна (по желанию)
	push 0
	call LoadIconA
	mov [WC.hIcon],EAX
	mov [WC.hIconSm],EAX
	push IDC_ARROW ;курсор окна
	push 0
	call LoadCursor
	mov [WC.hCursor],EAX
	mov [WC.hbrBackground],18 ;цвет окна
	mov [WC.lpszMenuName],0
	mov [WC.lpszClassName],offset CLASSNAME
	push offset WC ;загоняем созданный класс в стэк и... 
	call RegisterClassEx ;...регистрируем его

	;окно создадим в развёрнутом виде:
	push 0
	push [HINST]
	push 0
	push 0
	push 300	;dy - высота окна
	push 380	;dx - ширина окна
	push 200	;y - координата левого верхнего угла
	push 200	;x - координата левого верхнего угла
	push WS_OVERLAPPEDWINDOW ;перекрывающий стиль
	push offset TITLENAME ;имя окна
	push offset CLASSNAME ;имя класса
	push 0
	call CreateWindowEx
	cmp EAX,0
	jz _err 
	mov [HWNDMAIN],EAX ;если всё получилось - добавляем адрес,
	
	push SW_SHOWNORMAL ;стиль и
	push [HWNDMAIN]
	call ShowWindow ;показываем созданное окно
	push [HWNDMAIN]
	call UpdateWindow ;перерисовываем видимую часть окна 

msg_loop: ;цикл обработки сообщений
	push 0
	push 0
	push 0
	push offset msg
	call GetMessageA
	cmp EAX,0 ;если MSG нет...
	je end_loop ;...окончание цикла

	push offset msg
	call TranslateMessage
	push offset msg
	call DispatchMessageA
	jmp msg_loop ;закольцовываем

end_loop:
	push [msg.wParam]
	call ExitProcess ;выход из программы (закрыть процесс)
	
_err: ;символ "_" перед именем - общедоступность
	jmp end_loop
	
winproc: ;процедура окна - чем занимаемся
	push EBP 
	mov EBP,ESP 
	push EBX
	push ESI
	push EDI 
	cmp dword ptr [EBP+0Ch],WM_CREATE 
	je wmcreate 
	cmp dword ptr [EBP+0Ch],WM_COMMAND ;что сработало?..
	je wmcmd ;...смотрим тут
	cmp dword ptr [EBP+0Ch],WM_DESTROY 
	je wmdestroy 
	jmp defwndproc

wmcreate: 
;создали кнопку '7': 
	push 0
	push [HINST]
	push 0Eh 
	push [EBP+8h]
	push 45	
	push 65	
	push 55	
	push 5	
	push STYLBTN
	push offset CPBUT12 ;имя окна (символ на кнопке)
	push offset CLSBUTN ;имя класса
	push 0
	call CreateWindowEx ;функция создания окна
	mov HWNDBUT12,EAX ;сохраняем адрес кнопки
	
;создали кнопку '9': 
	push 0
	push [HINST]
	push 10h 
	push [EBP+8h]
	push 45	
	push 65	
	push 55 
	push 80	
	push STYLBTN
	push offset CPBUT14 
	push offset CLSBUTN 
	push 0
	call CreateWindowEx
	mov HWNDBUT14,EAX 
	
;создали окно редактирования:
	push 0
	push [HINST]
	push 1 
	push [EBP+8h]
	push 30	
	push 350	
	push 10	
	push 10	
	push STYLEDT
	push offset CPEDT ;символы в окне: " "
	push offset CLSEDIT ;имя класса
	push 0
	call CreateWindowEx
	mov HWNDEDT,EAX ;сохраняем адрес окна редактирования
	push HWNDEDT 
	call SetFocus
	mov EAX, 0
	jmp finish
	
wmcmd: 
	movzx EAX,word ptr[EBP+10h] ;wParam
	cmp EAX,0Eh
	je handl1_2
	cmp EAX,10h
	je handl1_2
	jmp defwndproc

handl1_2:
	push 16
	push offset BUF 
	push [EBP+14h] ;lParam = button handle
	call GetWindowText
	push offset BUF 
	push [HWNDEDT] 
	call SetWindowText
	
_exit:
	mov EAX,0
	jmp finish
	
wmdestroy:
	push 0
	call PostQuitMessage
	
defwndproc: ;обработка сообщений
	push [EBP+14h] 
	push [EBP+10h] ;WPARAM
	push [EBP+0Ch] 
	push [EBP+ 8h] 
	call DefWindowProc
	
finish:
	pop EDI
	pop ESI
	pop EBX
	pop EBP
	ret 16

	end go

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 19.04.2018, 16:00
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное