Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26

В VS код работает, в Builder - AV

17.01.2020, 20:18. Показов 3185. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

имеется DLL, в которую из вызывающего приложения (.exe) передаётся callback - ссылка на метод класса, с использованием
std::function/std::bind

вот код (ничего лишнего):

DLL:
C++
1
2
3
4
5
6
typedef std::function< bool __cdecl( int ) > Callback;
 
extern "C" __declspec(dllexport) bool __cdecl libInit( Callback cb)
{
    return true;
}
EXE:
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
typedef std::function< bool __cdecl( int ) > Callback;
 
typedef bool ( __cdecl *LibInit )( Callback cb );
 
LibInit libInit;
 
libInit = ( LibInit ) GetProcAddress( hinstLib, "libInit" );
 
Callback cb;
 
 
class MyClass
    {
        public:
 
            bool handler( int x )
            {
                return true;
            };
 
    };
 
MyClass myClass;
 
cb = std::bind( &MyClass::handler, myClass, std::placeholders::_1 );
 
libInit( cb );  // здесь вылетает AV (в C++ Builder)
когда оба бинарника (и DLL и EXE) скомпилированы в VS, то всё работает без проблем.
но если один из файлов (или оба) собрать в C++ Builder, то
программа валится при попытке передать ссылку на метод в DLL:
libInit( cb );

на мой взгляд проблема именно в передаче аргумента. пробовал играться с соглашениями о вызове -__cdecl, __stdcall - не помогает
в случае с VS работает всегда, внезависимости от того, какой вариант соглашения о вызове использовать.

вопрос в том, как заставить этот код работать в C++ Builder? Хотя бы в какую сторону копать?
с ассемблером знаком, в принципе могу поковыряться в отладчике, но мне кажется всё намного проще - нехватает какой-то галки в настройках билдера.

VS 2017
C++ Builder 10.3 (RAD Studio)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2020, 20:18
Ответы с готовыми решениями:

Почему данный код работает в builder 6 а в builder 10 не работает?
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(Handle, 0, 128,...

Работает ли у вас данный код на C++ Builder
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;mmsystem.h&gt; #include &lt;tchar.h&gt; #pragma comment(lib, &quot;WinMM.Lib&quot;) using...

Не получается нарисовать нужную фигуру в C++ Builder. Код написан но работает некорректно
Подскажите, пожалуйста! Пишу лабораторную работу по компьютерной графике. Дано задание написать программу в билдере, где нужно...

23
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 22:08
Цитата Сообщение от ctrong Посмотреть сообщение
вопрос в том, как заставить этот код работать в C++ Builder? Хотя бы в какую сторону копать?
std::function так передавать между физическими модулями нельзя. Передавай просто указатель на функцию
C++
1
typedef bool (__cdecl *Callback)(int);
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26
17.01.2020, 22:21  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Передавай просто указатель на функцию
не совсем понимаю - как передать? мой калбэк не просто функция, а метод класса.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 22:23
Цитата Сообщение от ctrong Посмотреть сообщение
не совсем понимаю - как передать? мой калбэк не просто функция, а метод класса.
Метод класса ты туда не передашь, никак. Только указатели на функцию и POD-типы
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26
17.01.2020, 22:25  [ТС]
но в VS то работает!
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 22:27
Цитата Сообщение от ctrong Посмотреть сообщение
но в VS то работает!
Потому что std::function там реализована одинаково. В разных версиях VS тоже не будет работать.
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26
17.01.2020, 22:31  [ТС]
нет. не может такого быть. по этой логике std::function и в билдере реализована одинаково, однако ж оба модуля в нём скомпилированные не работают.
dll мапится в общее с exe адресное пространство. с его бы std::function не работать?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 22:38
Цитата Сообщение от ctrong Посмотреть сообщение
нет. не может такого быть. по этой логике std::function и в билдере реализована одинаково, однако ж оба модуля в нём скомпилированные не работают.
dll мапится в общее с exe адресное пространство. с его бы std::function не работать?
std::function в билдере реализована и скомпилирована совсем не так как в студии. Просто поверь пока на слово, что так делать нельзя. То же касается любых других классов.

Добавлено через 22 секунды
Цитата Сообщение от ctrong Посмотреть сообщение
нет. не может такого быть. по этой логике std::function и в билдере реализована одинаково, однако ж оба модуля в нём скомпилированные не работают.
dll мапится в общее с exe адресное пространство. с его бы std::function не работать?
std::function в билдере реализована и скомпилирована совсем не так как в студии. Просто поверь пока на слово, что так делать нельзя. То же касается любых других классов.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.01.2020, 23:17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
То же касается любых других классов.
классы же то же можно импортировать/экспортировать, разве нет?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.01.2020, 23:17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
То же касается любых других классов.
классы же то же можно импортировать/экспортировать, разве нет?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 23:22
Цитата Сообщение от zayats80888 Посмотреть сообщение
классы же то же можно импортировать/экспортировать, разве нет?
Между модулями передаются не классы, а бинарный код, просто байты. Ты уверен что другой компилятор воспримет его также?

Добавлено через 15 секунд
Цитата Сообщение от zayats80888 Посмотреть сообщение
классы же то же можно импортировать/экспортировать, разве нет?
Между модулями передаются не классы, а бинарный код, просто байты. Ты уверен что другой компилятор воспримет его также?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.01.2020, 23:41
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты уверен что другой компилятор воспримет его также?
Ну если это COM интерфейс то должен работать и с разными компиляторами, а так да, в рамках одного будет работать.

Не по теме:

форум кажется подыхает...

0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26
17.01.2020, 23:45  [ТС]
мне всего лишь нужно передать указатель на метод произвольного класса в dll и потом его вызвать!
почему во всех языках мира это элементарная операция, а в плюсах какая-то лютая безнадёга!
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 23:48
Цитата Сообщение от zayats80888 Посмотреть сообщение
форум кажется подыхает...
Да ладно, выживет.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну если это COM интерфейс то должен работать и с разными компиляторами, а так да, в рамках одного будет работать.
Ну, std::function это ни разу не COM-интерфейс (просто ремарка для ТС)


Добавлено через 2 минуты
Цитата Сообщение от ctrong Посмотреть сообщение
мне всего лишь нужно передать указатель на метод произвольного класса в dll и потом его вызвать!
почему во всех языках мира это элементарная операция, а в плюсах какая-то лютая безнадёга!
Так ты не указатель пытаешься передавать. А создать объект и передавать его в абсолютно другой код, который не умеет работать с этим объектом. Подозреваю, такое даже на китайском бейсике не проканает.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
17.01.2020, 23:51
ctrong, ну так сделай как во всех языках мира - передай указатели на объект и статическую функцию. В любом виде. Будут это адреса или текстовые названия.
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26
17.01.2020, 23:57  [ТС]
Так ты не указатель пытаешься передавать. А создать объект и передавать его в абсолютно другой код, который не умеет работать с этим объектом. Подозреваю, такое даже на китайском бейсике не проканает.
хорошо, возможно пример с std::function неверный.
как тогда правильно передать в DLL указатель на метод, чтобы не описывать в DLL прототип класса, а только указать количество и типы аргументов этого метода?

Добавлено через 2 минуты
ну так сделай как во всех языках мира - передай указатели на объект и статическую функцию. В любом виде. Будут это адреса или текстовые названия.
вот в стартовом посте описан класс MyClass
как из DLL вызвать его метод handler?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.01.2020, 23:59
Цитата Сообщение от ctrong Посмотреть сообщение
как тогда правильно передать в DLL указатель на метод, чтобы не описывать в DLL прототип класса, а только указать количество и типы аргументов этого метода?
Берёшь любую функцию из WinAPI, например CreateFile, смотришь как она продекларирована и делаешь по аналогии
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26
18.01.2020, 00:06  [ТС]
Берёшь любую функцию из WinAPI, например CreateFile, смотришь как она продекларирована и делаешь по аналогии
я прошу вас воздержаться от ответов в этой теме. вы видимо не понимаете смысл моего вопроса.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.01.2020, 00:12
Цитата Сообщение от ctrong Посмотреть сообщение
я прошу вас воздержаться от ответов в этой теме. вы видимо не понимаете смысл моего вопроса.
Ок, без меня
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
18.01.2020, 00:18
Лучший ответ Сообщение было отмечено ctrong как решение

Решение

ctrong, ну так сделай как во всех языках мира - передай указатели на объект и статическую функцию. В любом виде. Будут это адреса или текстовые названия.
Цитата Сообщение от ctrong Посмотреть сообщение
вот в стартовом посте описан класс MyClass
как из DLL вызвать его метод handler?
например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class MyClass
    {
        public:
 
            static bool st_handler(MyClass* This, int x )
            {
                return This->handler(x);
            }
 
            bool handler( int x )
            {
                return true;
            }
     };
Добавлено через 3 минуты
собственно, наружу понадобится передать указатель на объект и указатель на статическую функцию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2020, 00:18
Помогаю со студенческими работами здесь

Работает на С++ Builder 6, но не работает на С++ Builder 2010(Embarcadero)
Здравствуйте форумчане! Есть кот рабочий на С++ Builder 6, а на С++ Builder 2010(Embarcadero) ругается при вызове Log. В чем...

Перенести код из C++ Builder 5 в C++ Builder 2009
Здравствуйте! Назрела проблема, может быть поможете. СУть в следующем - сделал прогу на 5-ом Билдере, приношу преподу показывать, а там...

Исходный код C++ Builder 6 в С++ Builder 5
Всем добрый вечер, ребята подскажите пожалуйста может кто сталкивался когда нужно исходник из 6 версии Builder'a описать в исходном коде 5...

Перенести код из VC++ в CPP Builder (код использует DLL)
Такая проблема. Есть DLL + пример её использования на Visual C++, пытаюсь этот пример перенести в Builder. Проблемы возникают в самом...

В VS 2015 не работает рекурсивная функция, которая работает в C++Builder
Добрый день! Перенес блок кода из старого учебного проекта под C++Builder, который там всегда стабильно работал, на VS 2015. Одна из...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru