|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
|||||||||||
callback - функции, как метод класса03.04.2023, 06:49. Показов 7269. Ответов 60
Метки нет (Все метки)
Здравствуйте! Хочу задать слудющий вопрос, хотя тема не нова, но я так её вкурить не могу, а именно, как задать в классе (метод класса) фукцию обратного вызова?
Есть функция, например, такая
почему если делать так, то выскакивает ошибка:
0
|
|||||||||||
| 03.04.2023, 06:49 | |
|
Ответы с готовыми решениями:
60
Метод класса не работает как callback-функция Методы класса как callback функции
|
|
Модератор
|
||
| 05.04.2023, 05:48 | ||
lParam при обработке WM_CREATE процедура окна получает CREATESTRUCT*.https://learn.microsoft.com/en... /wm-create https://learn.microsoft.com/en... atestructw Откуда там kwindow* ?
0
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||
| 05.04.2023, 05:51 | |||||||
|
Только организовать все несколько иначе имеет смысл на мой взгляд. 1) Цикл обработки сообщений вынести из класса kwindow. Либо просто в _tWinMain(), либо "по модному" - сделать отдельный класс TApplication и в него это все вынести (хотя это перебор на мой взгляд). В самом деле: окон ведь может быть несколько, из какого Go() вызывать в вашем случае? "из любого" - конечно ответ, но все же нелогично, согласитесь, этот цикл - явно не к окну по смыслу относится. 2) switch с выбором сообщений явно надо перенести в метод WndProc(). А функция должна просто вызывать метод - и все.
Есть же MFC, например, можно посмотреть как там сделано API идеологически. Это как раз по сути простейшая обертка над WinApi
0
|
|||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 05.04.2023, 05:55 | ||
|
Тогда в моем примере надо, конечно, в WndProcProxy отдельно обработать WM_CREATE и в этом случае метод класса не вызывать. В общем-то нет никакого особого смысла в обработке этого сообщения.
0
|
||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
||||
| 05.04.2023, 06:32 [ТС] | ||||
|
0
|
||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||||
| 05.04.2023, 06:49 | |||||||||
|
Так что (в случае вашей реализации Go() ) вызвать win1.Go(); win2.Go(); не выйдет, т.к. в первом же Go() вы "застрянете" на всё время работы приложения. Добавлено через 5 минут
Да, можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д., на основании этих знаний навернуть ассемблерный код по "подмахиванию" байтиков в нужные места. Это всё увлекательно и быть может даже полезно в учебных целях и в целях профессиональной пальцерастопыки, но никакого практического смысла и никаких выигрышей в сравнении с вариантом выше не даёт абсолютно. Всё равно где-то у вас обязательно будет объявлена "просто функция" в любом её обличии, которая в итоге будет вызывать метод класса, указатель на который будет передаваться через lparam. Ибо иначе - никак.
0
|
|||||||||
|
Модератор
|
|||||||
| 05.04.2023, 08:03 | |||||||
|
https://github.com/Chuyu-Team/... unk.h#L225
0
|
|||||||
| 05.04.2023, 08:48 | |
|
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 05.04.2023, 09:37 | |
|
politoto,
если вы видите разницу между ассемблерными вставками и прописыванием этого же в маш. кодах - ну я вас поздравляю, конечно.
0
|
|
|
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
|
|
| 05.04.2023, 09:59 | |
|
politoto,
Не факт что сработает. Исполнение кода на стеке/в куче может быть запрещено
0
|
|
| 05.04.2023, 10:22 | |
|
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
|||
| 05.04.2023, 11:50 | |||
|
Добавлено через 16 минут В простейшем случае можно так же просто this сохранить где-то в глобальной области и им пользоваться при вызове. Принципиальная суть от этого не изменится, только форма. Недостатки подходов, использующих глобальное состояние, думаю, никому не нужно здесь объяснять, хотя нужно сказать, что в определенных ситуациях это будет хорошо работать. Но я бы добавил что неизменность этой ситуации хорошо бы как-то гарантировать (но это не всегда возможно).
1
|
|||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
|||||||||||
| 05.04.2023, 21:47 [ТС] | |||||||||||
0
|
|||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||
| 05.04.2023, 21:59 | |||||
|
Добавлено через 2 минуты Добавлено через 55 секунд Можно создать сколько угодно окон одного класса. Например, окна класса Button для кнопок. Добавлено через 1 минуту Тем более, что неактивные окна тоже должны получать свои сообщения (например, WM_PAINT), если систем их отправила. DispatchMessage() внутри себя умеет понимать какую оконную функцию дернуть, т.е. к какому классу относится окно для данного сообщения (по hwnd).
0
|
|||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
|||||||||||||||
| 05.04.2023, 22:33 [ТС] | |||||||||||||||
|
Если действовать так как предлагал ты, то мы лишаемся такого средства С++, как полиморфизм, правильно?
И ещё, если объявлять функцию так, как она объявлена выше, то разве нельзя её использовать для обработки сообщений, она объявлена как static то есть this не помеха, тогда зачем этот финт нужен?
0
|
|||||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||
| 05.04.2023, 22:57 | |||||
|
Многопоточное приложение что-ли? Разумеется, всю обработку сообщений можно сложить в WndProcProxy (она подразумевалась под "выше", да?). Но ведь вся ветка с того и началась: как функцию обработки сообщений - т.е. WndProc - сделать методом класса. И в ветке было показано как. И вдруг такой неожиданный вопрос.
0
|
|||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
|||||
| 05.04.2023, 23:30 [ТС] | |||||
![]()
0
|
|||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||||
| 06.04.2023, 06:04 | ||||||
|
0
|
||||||
|
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
|
||
| 06.04.2023, 10:46 | ||
|
Не по теме: Не вы один.. походу ТС не знает что ему нужно. Ему предложили 100500 способов вызова метода класса как функции, но все ему не то...
0
|
||
| 06.04.2023, 10:46 | |
|
Нестатическая ссылка в статичной (BOOL CALLBACK EnumWindowsProc) функции внутри класса
CALLBACK функция как член класса
Как в аргумент функции передать указатель на метод класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|