Russian Qt Forum

Qt => Общие вопросы => Тема начата: StogovOleg от Май 16, 2008, 13:15



Название: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: StogovOleg от Май 16, 2008, 13:15
Есть dll'ка написанная на QT c экспортируемой функцией(например int getMessage() ) в которой создается экземпляр какого-нибудь класса QT (например QMessageBox mb;)
Библиотека подключается к проекту Builder'a( статически или динамически - результат один и тот же) и по нажатию на кнопку вызывается эта внешняя функция - пару секунд приложение думает а потом падает (Access violation ...) ...
если в функции int getMessage() не использовать классы QT а только стандартные типы то все работает нормально!!!

Хотелось бы узнать в чем дело и можно ли вообще так делать:)


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: Tonal от Май 16, 2008, 18:26
Какой именно класс тытался создать?
А QApplication создаётся?

Я делал плагины к делфийскому приложению - всё нормально работало. А у них с C++ Builder-ом рантайм одинаковый.


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: StogovOleg от Май 17, 2008, 10:13
Какой именно класс тытался создать?
А QApplication создаётся?

Я делал плагины к делфийскому приложению - всё нормально работало. А у них с C++ Builder-ом рантайм одинаковый.

Я пытался создать QMessageBox и QWidget - падает, а QApplication создается нормально...


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: Tonal от Май 17, 2008, 19:52
Вот после создания QApplication можно и QMessageBox создавать. :-)


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: StogovOleg от Май 19, 2008, 12:59
Вот после создания QApplication можно и QMessageBox создавать. :-)

Что-то ничего не получается:( QApplication создается а QMessageBox и т.д. падает!!!

Вот код библиотеки, может что-то не так:

#include <QApplication>
#include <QMessageBox>

extern "C" __declspec(dllexport) int getMessage()
{
       QApplication a(int argc, char** argv);  //обьект создается
       QMessageBox::information(0, "asdsa", "Asdas");   // падает
       return 1;
}

если закоментировать создание QT'шных обьектов то функция возвращает 1






Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: BRE от Май 19, 2008, 13:19
Вот код библиотеки, может что-то не так:

#include <QApplication>
#include <QMessageBox>

extern "C" __declspec(dllexport) int getMessage()
{
       QApplication a(int argc, char** argv);  // Объект не создается!!! Это прототип...
       QMessageBox::information(0, "asdsa", "Asdas");   // падает
       return 1;
}

На вскидку попробуй так
Код:
int argc = 1;
char *argv[] = { "prg" };

extern "C" __declspec(dllexport) int getMessage()
{
       QApplication a( argc, argv );
       QMessageBox::information(0, "asdsa", "Asdas");   // падает
       return 100;
}


Но лучше наверное будет создавать объект QApplication, в функции DllMain.


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: Tonal от Май 20, 2008, 07:48
Код:
QApplication a(int argc, char** argv)
Это объявление функции.
Объект нужно создавать, как написал BRE или проще:
Код:
QApplication a(0, 0);
Ну а засовывать в DllMain это не нужно, если собираешься модально работать - только диалог показывать например.
В одной функции попроще будет. :-)


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: uriel от Май 20, 2008, 07:58
А разве a.exec() потом вызывать не требуется, или это тонкости работы с библиотеками? :)


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: Alex03 от Май 20, 2008, 08:45
А разве a.exec() потом вызывать не требуется, или это тонкости работы с библиотеками? :)
QMessageBox::information() имеет свой exec().


Название: Re: Подключение dll написанной на QT к С++ Builder 6.0
Отправлено: StogovOleg от Май 21, 2008, 14:15
С прототипом накосячил :o согласен ::)

после создания QApplication создается все остальное:)

Всем огромное спасибо за помощь 8)