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

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

17.01.2020, 20:18. Показов 3134. Ответов 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
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,005
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
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,005
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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru