WMmail.ru - сервис почтовых рассылок

пятница, 20 апреля 2018 г.

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

  
Чемпионат мира по футболу FIFA 2018 в России! Узнать подробности...
  
Subscribe.ru
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 благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
Если выпуск не отображается, вы можете прочесть его на сайте

Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru.
Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.

Вы можете отказаться от получения писем.

Архив рассылки Поддержка подписчиков

Комментариев нет:

Отправить комментарий