Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22

Как сделать обратный вызов функции из dll?

03.10.2025, 16:38. Показов 2205. Ответов 30
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Почитал тему:
CallBack функции. Один из способов реализации
Попробовал реализовать. Не работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 void(*MyCallback);
void LoadFunc(void* lpFunc) {
    MessageBox(0, "OK", "OK", MB_OK);
    MyCallback = (void (*))lpFunc;
}
.............
void _stdcall foo3(unsigned int* y, int lpFunc)     // PROC lpFunc
{
    *y = 72;
 
    char buf1[32];
    snprintf(buf1, sizeof(buf1),"%i\x00", lpFunc);
    MessageBox(0, buf1, "Caption", MB_OK);
 
    
    MyCallback;
}
Передаю в библиотечную функцию 2 параметра: переменную и адрес Callback функции в вызывающей программе. Понимаю, что что-то сделал не так, а как надо сделать правильно, несмотря на долгие поиски в интернете, так и не понял.
Как правильно сделать обратный вызов функции из dll, чтобы она выполнялась в вызывающей программе?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2025, 16:38
Ответы с готовыми решениями:

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual...

Вызов функции DLL VB.NET в DLL C++
Как вызывать функции dll VB.NET через dll С++, которая приинжекчена к процессу проводника?

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
В связи с тем, что часто возникают одни и те же вопросы, а в нете копаться никто не любит привожу...

30
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
03.10.2025, 17:18
Лучший ответ Сообщение было отмечено Наталья8 как решение

Решение

Argus19, так что ли?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
//внутри DLL 
void foo3(unsigned int* y, void(*p)(unsigned int))
{
    *y = 72;
    p(*y);
}
 
int main()
{
    unsigned int y=42;
    foo3(&y,[](unsigned int y)
    {
        std::cout<<y;
    });
}
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
03.10.2025, 18:25  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Argus19, так что ли?
Может и так. Как я понимаю, мне нужно вызвать из dll функцию по переданному ей адресу. Т.е. сделать Callback.
Например, Callback в функции SetTimer:
C++
1
2
3
4
5
6
UINT_PTR SetTimer(
  [in, optional] HWND      hWnd,
  [in]           UINT_PTR  nIDEvent,
  [in]           UINT      uElapse,
  [in, optional] TIMERPROC lpTimerFunc
);
Соответственно, из программы, написанной на любом ЯП передаём три параметра и адрес Callback функции, созданной в вызывающей программе.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
03.10.2025, 19:08
Цитата Сообщение от Argus19 Посмотреть сообщение
передаём три параметра и адрес Callback функции, созданной в вызывающей программе.
ну, да. И тип функции должен строго соответствовать TIMERPROC
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
03.10.2025, 19:31  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
тип функции должен строго соответствовать TIMERPROC
С таймером всё понятно. Как мне вызвать Callback функцию из dll.
Адрес я передаю. Остаётся вызвать функцию из вызывающей программы на VB 6.0

Добавлено через 3 минуты
Это будет аналог этого:
C++
1
void "имя функции"();
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
03.10.2025, 19:40
Цитата Сообщение от Argus19 Посмотреть сообщение
передаём три параметра и адрес Callback функции
Указатель на функцию.

Цитата Сообщение от Argus19 Посмотреть сообщение
Остаётся вызвать функцию из вызывающей программы на VB 6.0
Так это в ветку VB.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
03.10.2025, 20:14  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Так это в ветку VB.
C VB 6 всё ясно и понятно. Надо сделать вызов из dll на С++. Пока не понятно, как.
Интернет не помог.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
03.10.2025, 20:28
Цитата Сообщение от Argus19 Посмотреть сообщение
Как мне вызвать Callback функцию из dll.
Пост #2, седьмая строка.
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
03.10.2025, 20:55  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Пост #2, седьмая строка.
Спасибо. Начинаю хоть что-то понимать. Завтра попробую.
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
03.10.2025, 23:54
Создание и использование DLL.pdf
(Я сам собирал...)
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
03.10.2025, 23:55
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
03.10.2025, 23:56

Вывело 72... И чё? И причём здесь кальбак..?
Ни чё не понял...
------
Собирал dll отдельным проектом.
Брал от туда файл *h и либу
и вставлял это в проект. Либу прописал в зависимости.
Файл dll конечно рядом с экзешником.
Я не профессионал, я только учусь.
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
04.10.2025, 00:34
Ну да... Если вот так сделать то понятнее.
Дошло...
C++
1
2
3
4
5
6
void foo3(unsigned int* y, void(*p)(unsigned int))
{
    *y = 72;
    for (int i{}; i<10; ++i)
            p(*y);
}
Название: NewPicture5 (2).png
Просмотров: 118

Размер: 2.4 Кб
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
04.10.2025, 07:03  [ТС]
Алексей1153, DrOffset, спасибо. Всё получилось.

Добавлено через 11 минут
Цитата Сообщение от Наталья8 Посмотреть сообщение
(Я сам собирал...)
Если посмотреть написанную вами dll Total Commander-ом (клавиша F3), будут ли видны имена ваших функций в закладке "Impots/Exports"?
1
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
04.10.2025, 10:33
Цитата Сообщение от Argus19 Посмотреть сообщение
Если посмотреть написанную вами dll
Что? Не правильная DLL?

Добавлено через 2 минуты
Цитата Сообщение от Наталья8 Посмотреть сообщение
(Я сам собирал...)
Сам собирал документ pdf.. Не надо удалять за источники...
Не пользую я тотал командер. Слишком сложно.
0
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 1
04.10.2025, 13:12
Цитата Сообщение от Argus19 Посмотреть сообщение
Остаётся вызвать функцию из вызывающей программы на VB 6.0
Главное _stdcall не забывать
1
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
04.10.2025, 13:28
Цитата Сообщение от testuser2 Посмотреть сообщение
из вызывающей программы на VB 6.0
Зачем вам бейсик.?.. Пишите уже на си....
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
04.10.2025, 13:48  [ТС]
Цитата Сообщение от Наталья8 Посмотреть сообщение
Что? Не правильная DLL?
Не знаю.
Цитата Сообщение от Наталья8 Посмотреть сообщение
Не пользую я тотал командер. Слишком сложно.
Есть ещё бесплатная программа, не требующая установки: Dependency Walker:
https://www.dependencywalker.com/
"Dependency Walker — это бесплатная утилита, которая сканирует любой 32- или 64-разрядный модуль Windows (exe, dll, ocx, sys и т. д.) и строит иерархическую древовидную диаграмму всех зависимых модулей. Для каждого найденного модуля утилита выводит список всех экспортируемых функций и показывает, какие из этих функций фактически вызываются другими модулями. В другом представлении отображается минимальный набор необходимых файлов, а также подробная информация о каждом файле, включая полный путь к файлу, базовый адрес, номера версий, тип компьютера, отладочную информацию и многое другое."
Цитата Сообщение от Наталья8 Посмотреть сообщение
Зачем вам бейсик.?.. Пишите уже на си....
Я работаю на VB 6.0 где-то c "нулевых". И до сих пор не могу сказать, что знаю его в полном объёме.
С++ мне нужен для создания библиотек, чтобы убрать в них "лишний" код.
Не люблю, когда от обилия кода рябит в глазах.
1
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
04.10.2025, 14:28
Цитата Сообщение от Argus19 Посмотреть сообщение
строит иерархическую древовидную диаграмму
Когда то что то строил... Не помогло.
Тут ещё соображать надо.

https://habr.com/ru/companies/... es/573756/
Вьедешь?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,528
Записей в блоге: 22
04.10.2025, 14:46  [ТС]
Цитата Сообщение от Наталья8 Посмотреть сообщение
Тут ещё соображать надо.
Не надо. Запустить программу, открыть нужную dll. Будет вот так:
Миниатюры
Как сделать обратный вызов функции из dll?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2025, 14:46
Помогаю со студенческими работами здесь

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете...

нет ucrtbased.dll, VCRUNTIME140D.dll, MSVCP140D.dll
Я написал небольшую прогу в вижуалке, мне нужно ее открывать на других пк, где ее нет. Если я ее...

Вызов dll ресурсов в dll
Помогите пожалуйста, вот такого рода проблемка вышла: Есть у меня dll и есть необходимость вызвать...

Вызов Dll-фий в другой Dll
не получается дернуть dll в другой dll. Подскажите, как должен происходить вызов dll1 в dll2 ? ...

Вызов dll из dll -> request example
Вызывающий код void (*dllHelloWorld) (void); //ok LPCTSTR s = L&quot;dll.dll&quot;; //ok HINSTANCE...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru