Russian Qt Forum
Ноябрь 23, 2024, 14:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Mingw Dll + MSVC. Возможно ли?  (Прочитано 8734 раз)
Bepec
Гость
« : Август 14, 2016, 14:38 »

Собственно сабж в шапке.

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

Попытался запихнуть в MSVC проект - функции резолвятся нормально, но при вызове функции с аргументами начинает материться на ESP регистр и неверное форматирование.

PS всегда думал, что стандарт один, что динамикой можно пользоваться везде. Видимо еще тонкости есть. C длл работал мало, потому проше совета (параллельно качаю VS чтоб разбираться).

PPS Dll собрана с использованием Qt, загрузчик - без него.

В дллке
Код:
#ifdef TESTLIB_LIB
# define TESTLIB_EXPORT Q_DECL_EXPORT
#else
# define TESTLIB_EXPORT Q_DECL_IMPORT
#endif

extern "C" TESTLIB_EXPORT void registerCallback(void (*inFunc)(void))
{
    // тело
}

В загрузчике
Код:
typedef void (__stdcall* type_registerCallback)(void (*)(void));
type_registerCallback registerCallback;
registerCallback = (type_registerCallback)GetProcAddress(hModule, "registerCallback");
Записан
Bepec
Гость
« Ответ #1 : Август 14, 2016, 15:45 »

Ммм... а чем тогда пользоваться, чтобы контейнеры передавать - своими самописными?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 14, 2016, 15:51 »

Сходу (на шару) попробуйте __cdecl вместо __stdcall

PS всегда думал, что стандарт один, что динамикой можно пользоваться везде. Видимо еще тонкости есть.
Которых на "неубогом" Вындоуз значительно больше. Напр обмен std контейнерами между приложением и dll-кой рухнет, т.к. у MSVC своя свадьба, у mingw своя.

Ммм... а чем тогда пользоваться, чтобы контейнеры передавать - своими самописными?
Ну как-то так. То Вы у "самой дружественной" спрашивайте  Улыбающийся
Записан
Bepec
Гость
« Ответ #3 : Август 14, 2016, 17:14 »

Эт вопрос скорее к компиляторам а не ОС, увы.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Август 14, 2016, 20:41 »

В дллках можно юзать тока примитивные типа.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #5 : Август 14, 2016, 20:42 »

Это как? Т.е. что-то сложнее int передавать нельзя?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Август 14, 2016, 21:58 »

Это как? Т.е. что-то сложнее int передавать нельзя?

Это как? Т.е. что-то сложнее int передавать нельзя?

Уточню: если дллка и хост используют зависимости, собранные разными компиляторами.
Ну то есть можно и QString передавать, если обе части собраны одной и той же студией с одной и той же версией Qt.
Иначе - обе части будут требовать разный рантайм, хотя имена параметров и будут идентичными.
Результат - крэш (как в Вашей ситуации).

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #7 : Август 15, 2016, 11:25 »

Ммм... ну смотрите - у меня есть нужда передать список структур простых типов.
std::list <myStruct> - можно ли это реализовать, чтобы потом разные компиляторы нормально воспринимали её?

PS Ну вон виндовские дллки же вполне нормально свои типы передают и для mingw и для msvc.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Август 15, 2016, 11:29 »

Цитировать
Ну вон виндовские дллки же вполне нормально свои типы передают и для mingw и для msvc.

Эмм.. ну там же обычно простые POD типы, а не всякие там классы.
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 15, 2016, 11:45 »

Ммм... ну смотрите - у меня есть нужда передать список структур простых типов.
std::list <myStruct> - можно ли это реализовать, чтобы потом разные компиляторы нормально воспринимали её?
Вряд ли. Переводите в POD, напр передавайте число эл-тов вектора и адрес первого. Ну и, как Вы знаете, std MSVC несовместимы по Debug/Release (шедевр MS)   

PS Ну вон виндовские дллки же вполне нормально свои типы передают и для mingw и для msvc.
А там нет std, одно WinAPI
Записан
Bepec
Гость
« Ответ #10 : Август 15, 2016, 12:14 »

Igors не могли бы вы дать пример как передавать вектор...
Ведь стдшный я как понимаю не подходит, а сам я его реализовывал... эмм.. лет 10 назад Веселый

PS мало работал с простыми типами.

Или вы имеете в виду обычный массив, аля myStruct[N], с указанием N отдельным аргументом?
« Последнее редактирование: Август 15, 2016, 12:23 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Август 15, 2016, 12:45 »

Напр так
Код
C++ (Qt)
std::vector<int> vec;
...
SomeCallDLL(&vec[0], vec.size());
Ну а в dll описать как
Код
C++ (Qt)
void SomeCallDLL( int * data, int num );
 
Записан
Bepec
Гость
« Ответ #12 : Август 15, 2016, 12:52 »

Хм.
А структуры так возвращать можно?
Возврат данных из дллки в каллбек функции, получается вот так?

Код:
void someCallBack(myStruct * data, int num);
void someCallBack(myStruct * data, int num)
{
for (int i = 0; i < num; i++)
{
    someFunc(data[i]);
}
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 15, 2016, 13:31 »

Хм.
А структуры так возвращать можно?
Возврат данных из дллки в каллбек функции, получается вот так?

Код:
void someCallBack(myStruct * data, int num);
void someCallBack(myStruct * data, int num)
{
for (int i = 0; i < num; i++)
{
    someFunc(data[i]);
}
}
myStruct должна быть известна dll'ке, не содержать std членов, и я бы еще выравнивание воткнул (#pragma pack). Короче - в "С стиле" все будет работать железно, в С++ хз, обычно нет 
Записан
Bepec
Гость
« Ответ #14 : Август 15, 2016, 14:31 »

Ну это известно должно быть обоим сторонам.

PS Жаль конечно что разные компиляторы не поддерживают. Отож на одном компиляторе и QWidget достать можно спокойно, не то что std.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.