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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание qt dll для проекта в msvc  (Прочитано 5502 раз)
erinyes
Гость
« : Апрель 05, 2013, 10:46 »

Дали задачу напиcать dll с gui, которая будет использоваться в проекте под студией. Я поразбирался и решил для начала сделать их примитивными, чтобы посмотреть, все ли будет нормально грузится и возникла проблема.

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

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

ps. Надеюсь, написал в нужный топик, хотя вопрос не совсем по Qt.
Записан
Bepec
Гость
« Ответ #1 : Апрель 05, 2013, 10:51 »

Мало кода, много букв.

Записан
erinyes
Гость
« Ответ #2 : Апрель 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
« Последнее редактирование: Апрель 05, 2013, 14:18 от erinyes » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Апрель 05, 2013, 15:18 »

А, да, забыл. dll делается в QtCreator'е с mingw
Люди !!! Не смешивайте алкоголь компиляторы !
Записан
erinyes
Гость
« Ответ #4 : Апрель 05, 2013, 16:04 »

Да понимаю, можно поменьше "!". Попробую с помощью студийного компилятора собрать.
А вообще, нормально так делать? Или как-то по-другому лучше?
Вообще, dll далеко не всегда совместимы, правильно понимаю (я читал про всякие заморочки с .def файлами)?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #5 : Апрель 05, 2013, 21:31 »

http://en.wikipedia.org/wiki/Name_mangling
Записан
erinyes
Гость
« Ответ #6 : Апрель 05, 2013, 22:38 »

Не, это понятно, хотя статью я прочитаю попозже целиком обязательно. Хотя в моем случае, я думаю, это не причем, потому что экспортная функция нашлась и вызвалась нормально. А что причем - я не знаю. Но, спасибо, в любом случае.
В общем, буду собирать под msvc
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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