Russian Qt Forum

Qt => Общие вопросы => Тема начата: erinyes от Апрель 05, 2013, 10:46



Название: Создание qt dll для проекта в msvc
Отправлено: erinyes от Апрель 05, 2013, 10:46
Дали задачу напиcать dll с gui, которая будет использоваться в проекте под студией. Я поразбирался и решил для начала сделать их примитивными, чтобы посмотреть, все ли будет нормально грузится и возникла проблема.

dll грузится явно, возвращает функцией указатель на абстрактный класс, внутри dll создается производный, exe вызывает виртуальные методы. Почему-то, метод show, который определен в производном класс как QDialog::show() падает с exception'ом.

Попробовал добавить метод с QList, который просто печатает число элементов - метод работает. Попробовал загрузить эту библиотеку в QtCreator'e и в codegear builder'е - вообще все работает. А под студией падает.
Хотелось бы услышать что может быть не так и/или какие у меня вообще альтернативы.

ps. Надеюсь, написал в нужный топик, хотя вопрос не совсем по Qt.


Название: Re: Создание qt dll для проекта в msvc
Отправлено: Bepec от Апрель 05, 2013, 10:51
Мало кода, много букв.



Название: Re: Создание qt dll для проекта в msvc
Отправлено: erinyes от Апрель 05, 2013, 12:11
абстрактный класс
Код
C++ (Qt)
class WindowInterface
{
public:    
   virtual void show() = 0;
   virtual int exec() = 0;
   virtual void print() = 0;
 
};
 

dll
Код
C++ (Qt)
#include "global.h"
#include <QDialog>
#include <QList>
#include <iostream>
#include "windowinterface.h"
 
namespace Ui {
class Editor;
}
 
class SHARED_EXPORT Editor :
       public QDialog,
       public WindowInterface
{
   Q_OBJECT
 
public:
   explicit Editor(QWidget *parent = 0);
   ~Editor();
   void print()
   {
       QList<int> l;
       l << 1 << 2;
       cout << "Test " << l.size() << endl;
   }
 
   virtual void show()
   {
       QDialog::show();
   }
 
   virtual int exec()
   {
       return QDialog::exec();
   }
 
private:
   Ui::Editor *ui;
};

Код
C++ (Qt)
#include "editor.h"
#include "ui_editor.h"
 
extern "C" WindowInterface* SHARED_EXPORT createInterface()
{
   int argc = 0;
   char **argv = 0;
   if(QApplication::instance() == 0)
       new QApplication(argc, argv);
 
   return new Editor;
}
 
Editor::Editor(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::tEditor)
{
   ui->setupUi(this);
}
 
Editor::~Editor()
{
   delete ui;
}

exe Visual Studio 2010
Код
C++ (Qt)
#include "windowinterface.h"
#include <Windows.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
typedef WindowInterface* (*WindowInterfaceFunc)();
HINSTANCE hDll = NULL;
hDll = LoadLibrary(TEXT(".\\editor.dll"));
if(hDll == NULL)
return -1;
WindowInterfaceFunc f = (WindowInterfaceFunc) GetProcAddress(hDll, "createInterface");
if(f == NULL)
return -2;
 
WindowInterface *window = f();
window->print();
window->show();
window->exec();
 
return 0;
}
 

А, да, забыл. dll делается в QtCreator'е с mingw


Название: Re: Создание qt dll для проекта в msvc
Отправлено: alex312 от Апрель 05, 2013, 15:18
А, да, забыл. dll делается в QtCreator'е с mingw
Люди !!! Не смешивайте алкоголь компиляторы !


Название: Re: Создание qt dll для проекта в msvc
Отправлено: erinyes от Апрель 05, 2013, 16:04
Да понимаю, можно поменьше "!". Попробую с помощью студийного компилятора собрать.
А вообще, нормально так делать? Или как-то по-другому лучше?
Вообще, dll далеко не всегда совместимы, правильно понимаю (я читал про всякие заморочки с .def файлами)?


Название: Re: Создание qt dll для проекта в msvc
Отправлено: alex312 от Апрель 05, 2013, 21:31
http://en.wikipedia.org/wiki/Name_mangling


Название: Re: Создание qt dll для проекта в msvc
Отправлено: erinyes от Апрель 05, 2013, 22:38
http://en.wikipedia.org/wiki/Name_mangling
Не, это понятно, хотя статью я прочитаю попозже целиком обязательно. Хотя в моем случае, я думаю, это не причем, потому что экспортная функция нашлась и вызвалась нормально. А что причем - я не знаю. Но, спасибо, в любом случае.
В общем, буду собирать под msvc