Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/30: Рейтинг темы: голосов - 30, средняя оценка - 4.90
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638

callback - функции, как метод класса

03.04.2023, 06:49. Показов 7267. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Хочу задать слудющий вопрос, хотя тема не нова, но я так её вкурить не могу, а именно, как задать в классе (метод класса) фукцию обратного вызова?
Есть функция, например, такая
C++
1
2
3
4
int CALLBACK EnumFontFamExProc(LPENUMLOGFONTEX lpelf,
                               NEWTEXTMETRICEX* lpntm,
                               DWORD FontType,
                               LPARAM lParam);
как сделать её методом класса?
почему если делать так, то выскакивает ошибка:
C++
1
2
3
4
5
6
7
8
class X
{
    public:
        int CALLBACK EnumFontFamExProc(LPENUMLOGFONTEX lpelf,
                               NEWTEXTMETRICEX* lpntm,
                               DWORD FontType,
                               LPARAM lParam);
};
Я так понял, это может привести к каким-то неприятным последствиям..., к каким?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2023, 06:49
Ответы с готовыми решениями:

Метод класса не работает как callback-функция
Всем привет! Помогите разобраться с синтаксисом. Есть gui-прога, в которой содержится функция TForm4::kau2_2_callback(float value) ...

Методы класса как callback функции
Всем привет. Пытаюсь разобраться как передавать методы класса в качестве callback. Я конечно понимаю, что есть решения вроде Boost или...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

60
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.04.2023, 15:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
класс, который создаёт окна, и хотел бы чтобы функция этого окна так же была в классе
Участвовать в обработке (а также предобработке, фильтрации и постобработке) того или иного сообщения могут целые деревья и барабаны различных объектов различных классов с++.
Как же всё-таки определить, какие именно объекты с++, а также модули, реализованные на других языках, должны обрабатывать данное сообщение данному окну?

Добавлено через 2 часа 18 минут

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
m_ldr_r16 = 0x580000D0; //Что это за значения? адреса чего?
m_ldr_r0 = 0x58000060;
Это похоже на 64-разрядные инструкции Load Register (literal), которые предназначены для загрузки констант из близлежащих слов в GPR.
https://developer.arm.com/docu... -literal--

Цитата Сообщение от ARM ddi0602
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bits(64) address = PC[] + offset;
bits(size*8) data;
boolean privileged = PSTATE.EL != EL0;
 
AccessDescriptor accdesc = CreateAccDescGPR(memop, nontemporal, privileged, tagchecked);
case memop of
    when MemOp_LOAD
        data = Mem[address, size, accdesc];
        if signed then
            X[t, 64] = SignExtend(data, 64);
        else
            X[t, size*8] = data;
 
    when MemOp_PREFETCHPrefetch(address, t<4:0>);
Первая заполняет X16, а вторая - X0

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
06.04.2023, 23:08  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Впрочем, сообщения не обязательно связаны с окнами, но это отдельная история.
С чего это она отдельная история как раз нужная, что значить ваше: сообщения не обязательно связаны с окнами...

Цитата Сообщение от KSergey9 Посмотреть сообщение
Не обязательно.
В твоём примере она где объявлена не внутри класса? что за нах... сами халивары разводят, а потом видите ли они суть теряют. Что мешает её определить и использовать, зачем в твоём случае в классе нужна функция WndProc в данном случае она лишняя, но если убрать статик, тогда....
C++
1
2
3
4
5
private:
        LRESULT CALLBACK WndProcProxy(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
        }
Цитата Сообщение от KSergey9 Посмотреть сообщение
Я перестал что-либо понимать по этим обрывкам.
Цитата Сообщение от Azathtot Посмотреть сообщение
Ему предложили 100500 способов вызова метода класса как функции, но все ему не то...
Т.е. вы срётесь друг с другом пытаясь перещеголять другого и потом я виноват, что вы, видите ли, потеряли нить дискуссии... Я отвечаю на вопросы, которые вы мне задаёте не более. Вопрос всё тот же, если про основной вопрос говорить, объявление функции обратного вызова внутри класса, не статическую функцию обратного вывода. Остальное пришло во время поиска решения этого вопроса, в том числе, создание иерархии классов(полиморфизм) просто потому, что это может понадобиться.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
06.04.2023, 23:29
Цитата Сообщение от Liss29 Посмотреть сообщение
объявление функции обратного вызова внутри класса
Если это callback, который передается на сторону С (т.е. обычная, классическая функция и указатель на нее в неком API), то передавать из класса получится только статическую функцию. Только.
Далее, если в конечном счете нужно получить вызов метода класса, следует еще дополнительно как-то передать this. Разные API, в зависимости от своей прямоты, обеспечивают те или иные способы передачи какой-либо userdat`ы (обычно это указатель на void, либо какое-то целое число). Частный пример - Get\SetWindowLong, позволяющий прикрепить такую юзердату к окну hwnd.
В общем для нужд вызова метода класса нужно this передать в качестве такой юзердаты. Далее дело техники: получаем юзердату внутри нашей функции обратного вызова, кастим юзердату к типу "указатель на наш класс", через получившийся this делаем вызов метода (возможно виртуального). Принцип этот везде одинаковый, различаться будет только форма записи кода, который это делает, в зависимости используемого API.
2
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
07.04.2023, 08:35
Цитата Сообщение от Liss29 Посмотреть сообщение
что значить ваше: сообщения не обязательно связаны с окнами...
Вообще никак не связано с данной темой, которая, напомню, озаглавлена "callback - функции, как метод класса".

По существу: см. PostThreadMessage, например.
А также погуглить "Message-Only Window", которое выведет на HWND_MESSAGE параметр. Это вариант не совсем "без окон", но о однако он показывает, что MS допекли желанием передавать сообщения, но "без окон", в ответ на что был сделан такой вот механизм экономии ресурсов.

Добавлено через 5 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Вопрос всё тот же, если про основной вопрос говорить, объявление функции обратного вызова внутри класса, не статическую функцию обратного вывода.
Ну так вот же ответ:
C++
1
2
3
4
5
private:
        LRESULT CALLBACK WndProcProxy(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
        }
где WndProc - полноценный метод класса. Т.е. это ровно ответ на твой вопрос.

Какой еще вопрос остался? не понятно.

Ты хочешь обойтись без WndProcProxy? ну так тебе на протяжении всей ветки говорят: это невозможно. В том или ином виде функция не метод класса будет присутствовать, должна присутствовать. Иначе никак.

Мне не понятно что тебе еще не понятно. Напиши развёрнуто вопрос который теперь тебя волнует, а не в форме "отвечаю на вопросы".

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
Т.е. вы срётесь друг с другом
Следи за базаром.
Все участники растолковывают тебе, разжёвывают ответ на твой вопрос.
Срёшься и путаешь своими метаниями только ты.

0
07.04.2023, 11:10

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
PostThreadMessage, например.
Из более ранних, Liss29, можете подумать о том, какому окну посылает сообщение PostQuitMessage()

https://learn.microsoft.com/en... uitmessage

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.04.2023, 11:19
Цитата Сообщение от KSergey9 Посмотреть сообщение
Это точно не имеется ввиду, т.к. цикл обработки сообщений вприложении - только один
Это неверно. Можно сколько угодно циклов выборки сообщений наделать, например, это делает менеджер диалоговых окон — он крутит внутри себя собственный цикл выборки сообщений.
Вы наверное имели ввиду «очередь сообщений»? Вот очередь сообщений на весь поток только одна.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
07.04.2023, 12:10
Замабувараев,
ваш ответ описывает один из частных случаев. При этом ответ столь краток, что лишь запутывает новичков. Особенно категоричное вступительное
Цитата Сообщение от Замабувараев Посмотреть сообщение
Это неверно.
Зачем? тут с простым-то моментом никак не можем сколько-нибудь вразумительно разобраться.
0
07.04.2023, 23:09  [ТС]

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
Следи за базаром.
Все участники растолковывают тебе, разжёвывают ответ на твой вопрос.
Мы свой базар фильтруем, так что пальцы не гни, ага!
Если все растолковывают ответ на один вопрос, то что вы вдруг путаться-терять смысл повествования стали, а, приблатнённый.



Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Из более ранних, Liss29, можете подумать о том, какому окну посылает сообщение PostQuitMessage()
Думалка не работает, но полагаю, тому окну, которое эту функцию вызвало.



Не по теме:

Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы наверное имели ввиду «очередь сообщений»? Вот очередь сообщений на весь поток только одна.
А если потоков несколько, тогда....

0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,296
08.04.2023, 01:59
Типичный троллинг.
Liss29,
Вас вообще, програмирование интересует?

Добавлено через 1 минуту
Или больше психология....

Добавлено через 2 минуты

Не по теме:

Вот у меня нету желания ни куда ни чего вставлять,
куда собака не вставляла.

0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
08.04.2023, 07:40
Цитата Сообщение от Наталья8 Посмотреть сообщение
Типичный троллинг.
И то верно. Тему следует закрыть нафик.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
08.04.2023, 08:24
Цитата Сообщение от Liss29 Посмотреть сообщение
А если потоков несколько, тогда....
Тогда у каждого потока своя очередь сообщений.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
10.04.2023, 09:03
Цитата Сообщение от Liss29 Посмотреть сообщение
А если без static-а тогда как? Если я делаю поле класса или метод класса static
Без static это уже будет скорее не методом класса, а методом экземпляра, выполняющимся в контексте одного из объектов (this) этого класса.
0
10.04.2023, 11:43

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
какому окну посылает сообщение PostQuitMessage()
Думалка не работает, но полагаю, тому окну, которое эту функцию вызвало.
Какое окно вызвало PostQuitMessage() в следующей бессмыслице?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
#include <fstream>
 
int
wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    CoInitializeEx(0,0);
 
    PostQuitMessage(321);
    MSG msg{};
    if ( 0 == GetMessage(&msg,0,0,0) )
    {
        {
        std::ofstream dump("dump.txt");
        dump << msg.wParam << '(' << msg.message << ") hwnd=" <<msg.hwnd << "\nWM_QUIT = " << WM_QUIT <<'\n';
        }
        SHELLEXECUTEINFOW shinfo{sizeof shinfo};
        shinfo.lpFile = L"dump.txt";
        shinfo.nShow = SW_NORMAL;
 
        auto res = ShellExecuteExW(&shinfo);
    }
}
#pragma comment(lib, "user32")
#pragma comment(lib, "shell32")
#pragma comment(lib, "ole32")

0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,296
11.04.2023, 16:35
Вы думаете вот так всё просто. Сумничал, запихнул и забыл....
Написал програмное обеспечение, имеешь кучу малообьяснимых глюков.
Особенно если написано на высоком уровне...
Типа какой то фрамеворк, или с+++ 11 - 14 - 22....
наверное дяди писавшие с++, не предусмотрели ваши идеи...
И как это будет работать в зависимости от загруза процессора, остальных программ,
распределения памяти, модели материнки.
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,296
11.04.2023, 16:56
Я пытаюсь рисовать на экране "резиновые нити".
Определяю размер области.
Она пульсирует. А иногда её не видно вообще.
Раньше рисовал на экранной области. Делал InvalidateRect экрана....
Все значки мигали. Написал программу форма на winApi.
Стала меняться окраска.
Я перестал рисовать на экране. Стал подставлять прозрачную форму.
Делаю InvalidateRect этой формы...
Что происходит в системе, почему нить иногда исчезает?
final_file(3).mp4
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,296
11.04.2023, 18:40
Бывают проблемы, и без запихивания кальбак функций в класс.

Добавлено через 1 час 42 минуты
Программу пишут, что бы работало,
а не для того, что бы что то такое наумничать,
что бы ни кто ни чего не понял.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
18.04.2023, 06:45  [ТС]

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Какое окно вызвало PostQuitMessage() в следующей бессмыслице?
Понятия не имею какое, здесь, вроде бы, совсем окон не должно быть...



Добавлено через 5 минут

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
Программу пишут, что бы работало,
а не для того, что бы что то такое наумничать,
что бы ни кто ни чего не понял.
Что бы работало, нужно понимать что ты делаешь, именно поэтому и задаются вопросы, если делать наугад/на авось, то вряд ли получится качественный код, понятный код, хотя он может работать... другое дело как он будет работать и сколько, до какого момента...

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.04.2023, 07:37
Цитата Сообщение от Liss29 Посмотреть сообщение
вряд ли получится качественный код, понятный код
Это кто тут такое говорит? У кого вместо использования говорящих названий полей структуры WNDCLASSEX идут невнятные «*p++ = 37»? Почему вы не следуете советам, которые даёте самому себе?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
18.04.2023, 22:55  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Почему вы не следуете советам, которые даёте самому себе?
Что ты говоришь, умник, как раз следую, код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
WORD* CreateDlg1(HWND hwnd)
    {
        //.............
 
        LPDLGTEMPLATE  lpdt;
        LPDLGITEMTEMPLATE lpdit;
        LPWSTR szDst = NULL;
 
        lpdt = (LPDLGTEMPLATE)p;
        lpdt->style = lStyle;
        lpdt->dwExtendedStyle = 0;
        lpdt->cdit = 6;
        lpdt->x = left;
        lpdt->y = top;
        lpdt->cx = wDlg;
        lpdt->cy = hDlg;
        p = (LPWORD)(lpdt + 1);
        *p++ = 0;
        *p++ = 0;
        p = fnWriteStrToDlg(p, szCaption);
        p = lpwAlign((LPWORD)p);
 
        //1
        lStyle = WS_CHILD | WS_VISIBLE | SS_CENTER;
        left = 0;
        top = 0;
        wItem = (MAXUSERNAME * cxChar);
        hItem = 3 * cyChar / 2;
 
        lpdit = (LPDLGITEMTEMPLATE)p;
        lpdit->style = lStyle;
        lpdit->dwExtendedStyle = 0;
        lpdit->x = left;
        lpdit->y = top;
        lpdit->cx = wItem;
        lpdit->cy = hItem;
        lpdit->id = ID_STATIC_USERNAME;
        p = (LPWORD)(lpdit + 1);
        p = fnWriteStrToDlg(p, TEXT("static"));
        p = fnWriteStrToDlg(p, szUser);
        *p++ = 0;
        p = lpwAlign((LPWORD)p);
        
        //......
        
    }


Добавлено через 9 минут

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Какое окно вызвало PostQuitMessage() в следующей бессмыслице?
Судя по всему т.к. созданием окон здесь и не пахнет, но процесс создаётся, в процессе создаётся поток, а, как выяснилось, у потока есть сврой цикл обработки сообщений, то PostQuitMessage(321); ставит в очередь потока WN_QUIT и поток, в данном случае главный поток, завершается, думаю как-то так.

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.04.2023, 06:40
Цитата Сообщение от Liss29 Посмотреть сообщение
p = (LPWORD)(lpdt + 1);
        *p++ = 0;
        *p++ = 0;
Что это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2023, 06:40

Нестатическая ссылка в статичной (BOOL CALLBACK EnumWindowsProc) функции внутри класса
Здравствуйте форумчане приступлю сразу к сути. В чем сущность алгоритма: Нужно собрать RECT всех отображаемых окон и записать в...

Callback как член класса
В общем, захотел я немного поработать с библиотекой libgit2. Эта библиотека предоставляет API Git'a. Т.е. можно написать свое приложение...

CALLBACK функция как член класса
struct DEVICEINFO { int nDDInfo; }; class CMy { public: void Init(); BOOL CALLBACK DXEnumDirectDraw(GUID FAR*...

Как передать функции через метод класса
Добрый вечер всем! Столкнулся с проблемкой К примеру у меня есть 3 функции.Я хочу в 4 функцию дать массив названий этих 3...

Как в аргумент функции передать указатель на метод класса?
Как в аргумент функции передать указатель на метод класса? Метод в классе у меня статический,все равно не получается(невозможно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
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
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru