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