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

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

03.04.2023, 06:49. Показов 7184. Ответов 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
05.04.2023, 05:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
switch(msg)
 {
 case WM_CREATE:
 {
 ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
 return 0;
 }
 //.....
}
Через 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
Цитата Сообщение от Liss29 Посмотреть сообщение
Т.е. если я хочу оформить класс, скажем, класс, который создаёт окна, и хотел бы чтобы функция этого окна так же была в классе я этого сделать не смогу иначе как
Технически - да, все так.
Только организовать все несколько иначе имеет смысл на мой взгляд.

1) Цикл обработки сообщений вынести из класса kwindow.
Либо просто в _tWinMain(), либо "по модному" - сделать отдельный класс TApplication и в него это все вынести (хотя это перебор на мой взгляд).
В самом деле: окон ведь может быть несколько, из какого Go() вызывать в вашем случае? "из любого" - конечно ответ, но все же нелогично, согласитесь, этот цикл - явно не к окну по смыслу относится.

2) switch с выбором сообщений явно надо перенести в метод WndProc(). А функция должна просто вызывать метод - и все.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class kwindow
{
    public:
        kwindow() { }
 
        LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)
        {
            switch(msg)
            {
                case WM_CREATE:
                {
                    //.......
                    return 0;
                }
                // case с другими обрабатываемыми сообщениями
             }
            return ::DefWindowProc(hwnd, msg, wParam, lParam);
        }
 
        void Create()
        {
            // .. здесь регистрация класса окна и создание окна
            WNDCLASSA WndClass;
            // заполнение WndClass....
            ....
            WndClass.lpfnWndProc = WndProcProxy;
            RegisterClass(&WndClass);  // добавить проверку результата, конечно
 
            hwnd = ::CreateWindow(..., (LPARAM)this);
        }
 
        void ShowWindow(int  nCmdShow)
        {
            ::ShowWindow(hwnd, nCmdShow);
        }
 
    private:
        HWND hwnd;
 
    private:
        static LRESULT CALLBACK WndProcProxy(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
        }
};
 
int WINAPI _tWinMain()
{
    kwindow win1(//......);
    win1.Create();
    win1.ShowWindow(SW_SHOW);  // или ShowModal сделать
 
    MSG msg = {};
    while(GetMessage(&msg, NULL, 0 , 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
     return msg.wParam;
}
Добавлено через 1 минуту
Есть же MFC, например, можно посмотреть как там сделано API идеологически. Это как раз по сути простейшая обертка над WinApi
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 05:51
Цитата Сообщение от Liss29 Посмотреть сообщение
А альтернатива лямбде?
Лямбде без захвата?
Статическая функция класса или "обычная" функция вне класса.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 05:55
Цитата Сообщение от politoto Посмотреть сообщение
Через lParam при обработке WM_CREATE процедура окна получает CREATESTRUCT*.
Хорошее замечание!

Тогда в моем примере надо, конечно, в WndProcProxy отдельно обработать WM_CREATE и в этом случае метод класса не вызывать. В общем-то нет никакого особого смысла в обработке этого сообщения.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
05.04.2023, 06:32  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
В самом деле: окон ведь может быть несколько, из какого Go() вызывать в вашем случае?
Что имеется ввиду, создать несколько объектов, например так, kwindow win1, win2; и для каждого вызывать Go, win1.Go(), win2.Go() или что имеется ввиду? Хотя построение конкретного класса в данном случае не так важна, тут бы разобраться с callback-оми внутри класса. Попутно можно, конечно, развить эту тему, тему создания некоего класса, допустим, окна, думаю это классический пример.

Цитата Сообщение от KSergey9 Посмотреть сообщение
этот цикл - явно не к окну по смыслу относится.
Ну, может быть и так.

Цитата Сообщение от politoto Посмотреть сообщение
Статическая функция класса или "обычная" функция вне класса.
Есть ещё вариант с подменой байтов, но не могу его найти, где-то в сети видел подобный вариант и, вроде бы, он как раз относился к встраиванию callback-функции в класс...
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 06:49
Цитата Сообщение от Liss29 Посмотреть сообщение
создать несколько объектов, например так, kwindow win1, win2;
Да, у вас же не одно окно в приложении будет.

Цитата Сообщение от Liss29 Посмотреть сообщение
и для каждого вызывать Go, win1.Go(), win2.Go() или что имеется ввиду?
Это точно не имеется ввиду, т.к. цикл обработки сообщений вприложении - только один; более того, из цикла обработки сообщений вы выходите при завершении приложения.
Так что (в случае вашей реализации Go() ) вызвать
win1.Go();
win2.Go();
не выйдет, т.к. в первом же Go() вы "застрянете" на всё время работы приложения.

Добавлено через 5 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Есть ещё вариант с подменой байтов,
Вот этот вариант и есть "с подменой байтов" на самом деле:
C++
1
((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
Вы просто этого не осознаёте.

Да, можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д., на основании этих знаний навернуть ассемблерный код по "подмахиванию" байтиков в нужные места. Это всё увлекательно и быть может даже полезно в учебных целях и в целях профессиональной пальцерастопыки, но никакого практического смысла и никаких выигрышей в сравнении с вариантом выше не даёт абсолютно. Всё равно где-то у вас обязательно будет объявлена "просто функция" в любом её обличии, которая в итоге будет вызывать метод класса, указатель на который будет передаваться через lparam. Ибо иначе - никак.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 08:03
Цитата Сообщение от KSergey9 Посмотреть сообщение
можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д., на основании этих знаний навернуть
Вот, например:
https://github.com/Chuyu-Team/... unk.h#L225
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
struct _stdcallthunk {
    ULONG   m_ldr_r16;      // ldr  x16, [pc, #24]
    ULONG   m_ldr_r0;       // ldr  x0, [pc, #12]
    ULONG   m_br;           // br   x16      
    ULONG   m_pad;  
    ULONG64 m_pThis;
    ULONG64 m_pFunc;
    BOOL Init(DWORD_PTR proc, void* pThis) {
        m_ldr_r16 = 0x580000D0;
        m_ldr_r0 = 0x58000060;
        m_br = 0xd61f0200;
        m_pThis = (ULONG64)pThis;
        m_pFunc = (ULONG64)proc;
        // write block from data cache and          
        //  flush from instruction cache        
        FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));  
        return TRUE;
    }
    void* GetCodeAddress() {
        return this;
    }
    void* operator new(size_t)
    {
        return __AllocStdCallThunk();
    }
    void operator delete(void* pThunk) {
        __FreeStdCallThunk(pThunk);
    }
};
Навернули без ассемблеров.
0
05.04.2023, 08:48

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
m_ldr_r16 = 0x580000D0;
m_ldr_r0 = 0x58000060;
m_br = 0xd61f0200;
Если это не ассемблер - то я римский папа как минимум.

0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.04.2023, 09:28
Это присваивание значений ( в нашем случае - кодов инструкций ) членам _stdcallthunk средствами c++.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 09:37
politoto,
если вы видите разницу между ассемблерными вставками и прописыванием этого же в маш. кодах - ну я вас поздравляю, конечно.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
05.04.2023, 09:59
politoto,
Не факт что сработает. Исполнение кода на стеке/в куче может быть запрещено
0
05.04.2023, 10:22

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
если вы видите разницу между ассемблерными вставками и прописыванием этого же в маш. кодах
В MSVC x64 асмовские вставки вообще не предусмотрены, что не мешает генерировать инструкции стандартными средствами c++.

0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
05.04.2023, 11:50
Цитата Сообщение от Azathtot Посмотреть сообщение
Исполнение кода на стеке/в куче может быть запрещено
Насколько тут можно увидеть, за гарантии возможности исполнения здесь отвечает __AllocStdCallThunk. А там внутри наверняка вызов VirtualAlloc с чем-то вроде PAGE_EXECUTE_READWRITE.

Добавлено через 16 минут
Цитата Сообщение от KSergey9 Посмотреть сообщение
если я верно понял общую смысловую идею
Идея поста №14 до безумия проста: давайте сохраним callable (со всей типизацией) в статическом объекте, а затем будем через этот статический объект делать контекстный вызов метода.
В простейшем случае можно так же просто this сохранить где-то в глобальной области и им пользоваться при вызове. Принципиальная суть от этого не изменится, только форма.

Недостатки подходов, использующих глобальное состояние, думаю, никому не нужно здесь объяснять, хотя нужно сказать, что в определенных ситуациях это будет хорошо работать. Но я бы добавил что неизменность этой ситуации хорошо бы как-то гарантировать (но это не всегда возможно).
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
05.04.2023, 21:47  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
у вас же не одно окно в приложении будет.
Исходить нужно из этого.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Это точно не имеется ввиду, т.к. цикл обработки сообщений вприложении - только один;
Это факт почему-то, не знаю почему, я всегда упускаю из виду, не могу я принять тот факт, что n-ое количество окон обрабатывает один цикл обработки сообщений.( И в параллельных программах это так же?!
Цитата Сообщение от KSergey9 Посмотреть сообщение
Так что (в случае вашей реализации Go() ) вызвать
А в случае твой реализации это не так) Ну, хорошо, я с этим соглачен, но, что если нужно оформить класс так, чисто теоретически, как будет происходить выборка сообщений для окон... при регистрации класса окна(может быть регистрацию тоже нужно оформить, как отдельный класс) мы указываем для каждого окна его функцию, так? так. Происходит выборка сообщений (GetMessage берёт сообщение из очереди) и исходя из того какое окно активно и на каком окне произошло событие отправляет(DispatchMessage ориентируется по HWND окна, если я не ошибаюсь) его тому окну. Так что, по идее, должно работать правильно.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Да, можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д.,
Ради этого всё и затевается, что бы разобраться, ибо, если знаешь как работает, не теоретически, а действительно понимаешь, тогда многие вопросы сами собой отпадают, разве не так?)

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

C++
1
2
3
4
5
6
7
8
9
10
11
[quote="politoto;16843680"]BOOL Init(DWORD_PTR proc, void* pThis) {
        m_ldr_r16 = 0x580000D0;  //Что это за значения? адреса чего?
        m_ldr_r0 = 0x58000060;
        m_br = 0xd61f0200;
        m_pThis = (ULONG64)pThis;
        m_pFunc = (ULONG64)proc;
        // write block from data cache and          
        //  flush from instruction cache        
        FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));  
        return TRUE;
    }[/quote]
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 21:59
Цитата Сообщение от Liss29 Посмотреть сообщение
один цикл обработки сообщений.( И в параллельных программах это так же?!
А что такое "параллельные программы"?

Добавлено через 2 минуты
Цитата Сообщение от Liss29 Посмотреть сообщение
может быть регистрацию тоже нужно оформить, как отдельный класс
Смысла нет.

Добавлено через 55 секунд
Цитата Сообщение от Liss29 Посмотреть сообщение
мы указываем для каждого окна его функцию, так? так
Нет, не так. Функция указывается для класса окон, а не конкретного окна. См. мой пример кода и описание соотв. функций.
Можно создать сколько угодно окон одного класса. Например, окна класса Button для кнопок.

Добавлено через 1 минуту
Цитата Сообщение от Liss29 Посмотреть сообщение
и исходя из того какое окно активно и на каком окне произошло событие отправляет(DispatchMessage ориентируется по HWND окна, если я не ошибаюсь) его тому окну.
Windows сама отлично знает кому какое сообщение отправить. И какую именно функцию для обработки сообщения вызвать в зависимости от класса окна.
Тем более, что неактивные окна тоже должны получать свои сообщения (например, WM_PAINT), если систем их отправила.

DispatchMessage() внутри себя умеет понимать какую оконную функцию дернуть, т.е. к какому классу относится окно для данного сообщения (по hwnd).
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
05.04.2023, 22:33  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
А что такое "параллельные программы"?
Параллельное программирование.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Нет, не так. Функция указывается для класса окон
Я это и имел ввиду, формулировка, не та, но я имел ввиду именно регистрацию класса окна.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Windows сама отлично знает кому какое сообщение отправить.
Откуда она это знает... я знаю, что windows это знает, не телепатически же она об этом узнаёт.)

Цитата Сообщение от KSergey9 Посмотреть сообщение
т.е. к какому классу относится окно для данного сообщения (по hwnd).
Ну хоть какая-то конкретика.

Если действовать так как предлагал ты, то мы лишаемся такого средства С++, как полиморфизм, правильно?
C++
1
2
3
4
5
private:
        static LRESULT CALLBACK WndProcProxy(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return ((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
        }
Но ведь может потребоваться или даже практически наверняка потребуется наследование, что делать...
И ещё, если объявлять функцию так, как она объявлена выше, то разве нельзя её использовать для обработки сообщений, она объявлена как static то есть this не помеха, тогда зачем этот финт нужен?
C++
1
((kwindow*)lParam)->WndProc(hwnd, msg, wParam, lParam);
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
05.04.2023, 22:57
Цитата Сообщение от Liss29 Посмотреть сообщение
Параллельное программирование.
Это слишком общий и неконкретный термин, чтобы можно было что-то предметно обсуждать.
Многопоточное приложение что-ли?

Цитата Сообщение от Liss29 Посмотреть сообщение
Откуда она это знает... я знаю, что windows это знает, не телепатически же она об этом узнаёт.)
Да вроде очевидно же: в сообщении есть hwnd, уникальный идентификатор окна; по нему можно получить информацию о классе окна, а значит и об адресе оконной процедуры, есть даже соотв. функции API. Впрочем, hwnd - это явно напрямую адрес внутренней структуры Windows, где вся эта информация уже есть, чтобы быстро, значить.

Цитата Сообщение от Liss29 Посмотреть сообщение
то мы лишаемся такого средства С++, как полиморфизм, правильно?
Виртуальные функции пока не запрещены ведь, так? Хочется наследоваться - делаем как в любом уважающем себя фреймворке, т.е. объявляем ее виртуальной. Но замечание хорошее, да.

Цитата Сообщение от Liss29 Посмотреть сообщение
И ещё, если объявлять функцию так, как она объявлена выше, то разве нельзя её использовать для обработки сообщений, она объявлена как static то есть this не помеха, тогда зачем этот финт нужен?
Вот это вообще не понял.
Разумеется, всю обработку сообщений можно сложить в WndProcProxy (она подразумевалась под "выше", да?).
Но ведь вся ветка с того и началась: как функцию обработки сообщений - т.е. WndProc - сделать методом класса. И в ветке было показано как.
И вдруг такой неожиданный вопрос.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
05.04.2023, 23:30  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Многопоточное приложение что-ли?
Не знаю, книг скачал, там речь идёт о параллельном программировании "Параллельное программирование на C++", что-то в этом духе, где тут многопоточность упоминается? Так что всё же параллельное, а не многопоточное в многопоточном приложении цикл обработки сообщений один, это я знаю, но забываю)

Цитата Сообщение от KSergey9 Посмотреть сообщение
в сообщении есть hwnd, уникальный идентификатор окна;
Да, есть, значит windows реагируя на запрос GetMessage основывается на этом факте при выборе сообщений, выбирает сообщения только с нужными hwnd....

Цитата Сообщение от KSergey9 Посмотреть сообщение
Виртуальные функции пока не запрещены ведь, так?
Но при объявлении static переменных или функций this для этого класса перестаёт существовать, а полиморфизм требует наличия этого указателя, разве не так?!

Цитата Сообщение от KSergey9 Посмотреть сообщение
Разумеется, всю обработку сообщений можно сложить в WndProcProxy (она подразумевалась под "выше", да?).
Но ведь вся ветка с того и началась: как функцию обработки сообщений - т.е. WndProc - сделать методом класса. И в ветке было показано как.
Разве WndProcProxy не равно функция окна, она не внутри класса располагается...

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
И вдруг такой неожиданный вопрос.
Сам удивляюсь.

0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
06.04.2023, 06:04
Цитата Сообщение от Liss29 Посмотреть сообщение
Не знаю, книг скачал, там речь идёт о параллельном программировании
Хорошо, как будут более внятные условия - будет смысл обсудить.

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

Цитата Сообщение от Liss29 Посмотреть сообщение
Разве WndProcProxy не равно функция окна,
Да, именно функция окна.

Цитата Сообщение от Liss29 Посмотреть сообщение
она не внутри класса располагается...
Не обязательно.

Цитата Сообщение от Liss29 Посмотреть сообщение
Но при объявлении static переменных или функций this для этого класса перестаёт существовать, а полиморфизм требует наличия этого указателя, разве не так?!
Давайте вы заново полностью сформулируете вопрос. Я перестал что-либо понимать по этим обрывкам.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
06.04.2023, 10:46
Цитата Сообщение от KSergey9 Посмотреть сообщение
Я перестал что-либо понимать по этим обрывкам.

Не по теме:

Не вы один.. походу ТС не знает что ему нужно. Ему предложили 100500 способов вызова метода класса как функции, но все ему не то...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2023, 10:46

Нестатическая ссылка в статичной (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...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru