Russian Qt Forum

Qt => Общие вопросы => Тема начата: Bepec от Август 14, 2016, 14:38



Название: Mingw Dll + MSVC. Возможно ли?
Отправлено: 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");


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 14, 2016, 15:45
Ммм... а чем тогда пользоваться, чтобы контейнеры передавать - своими самописными?


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Igors от Август 14, 2016, 15:51
Сходу (на шару) попробуйте __cdecl вместо __stdcall

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

Ммм... а чем тогда пользоваться, чтобы контейнеры передавать - своими самописными?
Ну как-то так. То Вы у "самой дружественной" спрашивайте  :)


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 14, 2016, 17:14
Эт вопрос скорее к компиляторам а не ОС, увы.


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Racheengel от Август 14, 2016, 20:41
В дллках можно юзать тока примитивные типа.


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 14, 2016, 20:42
Это как? Т.е. что-то сложнее int передавать нельзя?


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Racheengel от Август 14, 2016, 21:58
Это как? Т.е. что-то сложнее int передавать нельзя?

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

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



Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 15, 2016, 11:25
Ммм... ну смотрите - у меня есть нужда передать список структур простых типов.
std::list <myStruct> - можно ли это реализовать, чтобы потом разные компиляторы нормально воспринимали её?

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


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: kuzulis от Август 15, 2016, 11:29
Цитировать
Ну вон виндовские дллки же вполне нормально свои типы передают и для mingw и для msvc.

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


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

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


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 15, 2016, 12:14
Igors не могли бы вы дать пример как передавать вектор...
Ведь стдшный я как понимаю не подходит, а сам я его реализовывал... эмм.. лет 10 назад :D

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

Или вы имеете в виду обычный массив, аля myStruct[N], с указанием N отдельным аргументом?


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Igors от Август 15, 2016, 12:45
Напр так
Код
C++ (Qt)
std::vector<int> vec;
...
SomeCallDLL(&vec[0], vec.size());
Ну а в dll описать как
Код
C++ (Qt)
void SomeCallDLL( int * data, int num );
 


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 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]);
}
}


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Igors от Август 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). Короче - в "С стиле" все будет работать железно, в С++ хз, обычно нет 


Название: Re: Mingw Dll + MSVC. Возможно ли?
Отправлено: Bepec от Август 15, 2016, 14:31
Ну это известно должно быть обоим сторонам.

PS Жаль конечно что разные компиляторы не поддерживают. Отож на одном компиляторе и QWidget достать можно спокойно, не то что std.