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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как экпортировать весь класс из DLL ?  (Прочитано 11073 раз)
admsasha
Гость
« : Июнь 01, 2011, 04:31 »

Как делать экспорт и загрузку функций я знаю и все хорошо работает. А как сделать экспорт всего класса и как потом с ним работать ?
Записан
asvil
Гость
« Ответ #1 : Июнь 01, 2011, 08:53 »

qthelp://com.trolltech.qt.470/qdoc/sharedlibrary.html
Записан
Denjs
Гость
« Ответ #2 : Июнь 01, 2011, 13:08 »

Как делать экспорт и загрузку функций я знаю и все хорошо работает. А как сделать экспорт всего класса и как потом с ним работать ?
Стоп, стоп) давайте поймем что значит _экспортировтаь_класс_?
давайте на примере и не забывайте, что С++ - компилируемый язык, а не интерпретируемый.
Вы не можете описать в программе работу с классом, который не известен в момент компиляции программы.

Вы можете вернуть из функции библиотеки объект. Объект который создается внутри библиотеки и возвращается по ссылке известного в момент компиляции типа. т.е. класс вашего обхекта должен наследовать один из известных программе классов-прототипов, иначе вы не сможете с ним работать.


Или подробнее опишите что вы хотите?
« Последнее редактирование: Июнь 01, 2011, 13:44 от Denjs » Записан
admsasha
Гость
« Ответ #3 : Июнь 01, 2011, 14:04 »

Например, имеется класс

class myClass {
   public:
     void foo1();
     int foo2(int,int);
   private:
     int a;
     int b;
}


Вот и нужно сделать его доступным.

чтобы обращаться,  не как foo1(),  а exportClass.foo1();

Записан
Denjs
Гость
« Ответ #4 : Июнь 01, 2011, 14:22 »

Вот и нужно сделать его доступным.

чтобы обращаться,  не как foo1(),  а exportClass.foo1();
где (давайте разъясним) "exportClass.foo1()" - это не что иное как:
* exportClass - это имя _объекта_,
* а foo1 - имя функции класса myClass .

Напишите в библиотеке функцию, которая возвращает вам ссылку на объект класса myClass и далее получите приравняйте его вашей переменной exportClass и обращайтесь к функции "foo1()" как "exportClass->foo1()" Непонимающий? нет? в чем сложность?
Естественно, вы можете отдать по ссылке *myclass объект дочернего от myclass класса. и у него функция foo1() - может делать что-то своё, иное.


PS:Ещё раз: вы можете получить из библиотеки объект. А "описание класса - нового неизвестного при компиляции основной программы" - нет. С++ - это компилируемый язык. Вы можете работать тольок с типами изветсными в момент компиляции.
« Последнее редактирование: Июнь 01, 2011, 14:27 от Denjs » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Июнь 01, 2011, 14:59 »

может товарищ имеет в виду reflection?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
iks
Гость
« Ответ #6 : Июнь 11, 2011, 00:49 »

Вот в таком духе примерно можно подключить библиотеку и работать с ней
Сброка плагина
.pro
Код
C++ (Qt)
TEMPLATE = lib
CONFIG += plugin
QT += network
TARGET = FileManager
SOURCES += getManager.cpp
HEADERS += getManager.h \
   interfaceManager.h
 
unix: {
   DESTDIR = /home/user/Qt/project/plugins
} else {
   DESTDIR = ../EXE/project/plugins
}
 
interfaceManager.h
Код
C++ (Qt)
#ifndef INTERFACEMANAGER_H
#define INTERFACEMANAGER_H
 
#include <QtGlobal>
class QStringList;
 
class interfaceManager
{
public:
   virtual ~interfaceManager() {}
   virtual void startClass(QStringList *lst) = 0;
};
 
Q_DECLARE_INTERFACE(interfaceManager, "www.interfaceManager/1.0")
 
#endif // INTERFACEMANAGER_H
getManager.h
Код
C++ (Qt)
#ifndef GETMANAGER_H
#define GETMANAGER_H
 
#include "interfaceManager.h"
#include <QObject>
class QStringList;
 
class getManager : public QObject, public interfaceManager
{
Q_OBJECT
Q_INTERFACES(interfaceManager)
 
public:
   getManager(QObject *parent = 0);
   void startClass(QStringList *lst);
private:
   QStringList *urls;
   int counter;
   void filesDowland();
 
private slots:
   void slotReadyRead();
};
 
#endif // GETMANAGER_H
getManager.cpp
Код
C++ (Qt)
#include "getManager.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtCore/QUrl>
#include <QtCore/QtPlugin>
#include <QStringList>
 
getManager::getManager(QObject *parent) : QObject(parent){}
 
void getManager::startClass(QStringList *lst)
{
   urls = new QStringList(lst);
   counter = 0;
   filesDowland();
   return;
}
/** download files **/
void getManager::filesDowland()
{
   //--Windows
   QNetworkAccessManager *manager = new QNetworkAccessManager(this);
   connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotReadyRead()));
 
   manager->get(QNetworkRequest(QUrl( urls->at(counter) )));
 
   return;
}
 
/** uploaded, on **/
void getManager::slotReadyRead()
{
   counter++;
 
   /** Actions with the file **/
 
   if(counter < urls->count()) filesDowland();
   return;
}
 
Q_EXPORT_PLUGIN2(getmanager, getManager)
 
Программа
.pro
Код
C++ (Qt)
TARGET = test
TEMPLATE = app
 
unix: {
   DESTDIR = /home/user/Qt/project
} else {
   DESTDIR = ../EXE/project
}
SOURCES += main.cpp
HEADERS += ../srcPugin/interfaceManager.h #interfaceManager.h Connect necessarily header interface plugin
 
main.cpp
Код
C++ (Qt)
#include "../srcPugin/interfaceManager.h"
#include <QApplication>
#include <QObject>
#include <QPluginLoader>
#include <QStringList>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   QString libFile;
   #if (defined(_WIN32) || defined(_WIN64))
       libFile = "plugins/libFileManager.dll";
   #else
       libFile = "/home/user/Qt/project/plugins/libFileManager.so";
   #endif
   QPluginLoader loader(libFile);
   loader.load();
   QObject *plugin = loader.instance();
   if(plugin)
   {
       interfaceManager *fileManager = qobject_cast<interfaceManager *>(plugin);
       if(fileManager) {
           QStringList *lst = new QStringList();
           lst->append("http://url_1");
           // ..........
           lst->append("http://url_....");
           fileManager->startClass(lst);
           qDebug() << "Ok!!!";
       } else
           qDebug() << "No 2";
   } else
       qDebug() << "No 1";
   return a.exec();
}
Правильно заданый вопрос - половина ответа.
"Как экпортировать весь класс из DLL" если куда-то что-то отправляем то это экспорт, если берем то импорт, а экспорт "ИЗ" не стыкуется как-то.
Я ответил на вопрос "Как ИМПОРТИРОВАТЬ весь класс из DLL", или это не совсем то о чем спрашивалось?
--------------------------------------
В вложении немного другая реализация, там я проверялся как проще организовать сигнально слотовую связь, без лишних наследований и зависимостей, решение пришло после посещения форума http://developer.qt.nokia.com/forums
Вполне рабочее решение получилось
« Последнее редактирование: Июнь 23, 2011, 22:49 от iks » Записан
andybeg
Гость
« Ответ #7 : Июнь 20, 2011, 11:50 »

iks
дико извиняюсь, я взял тестовый проект pluginTest и при компиляции он ругнулся в несколько строк вида
Код:
C:\dev\pluginTest\src\plugin\Plugin.cpp:-1: ошибка: undefined reference to `_imp___ZN6QLabelC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE'
Записан
ритт
Гость
« Ответ #8 : Июнь 20, 2011, 19:49 »

QT += gui ?
Записан
andybeg
Гость
« Ответ #9 : Июнь 20, 2011, 20:47 »

опачки, действительно, там вместо "+" стоял "-" спасибо
Записан
iks
Гость
« Ответ #10 : Июнь 20, 2011, 22:43 »

ну не знаю у меня с минусом все в норме, правда на Linux все пишу и тестирую =) а вообще можете просто удалить строку QT += gui по идее должно нормально пойти в плагине
« Последнее редактирование: Июнь 20, 2011, 22:47 от iks » Записан
andybeg
Гость
« Ответ #11 : Июнь 21, 2011, 00:07 »

да, забыл упомянуть, что под линух у мя такой ошибки не было
Записан
iks
Гость
« Ответ #12 : Июнь 23, 2011, 22:54 »

Обновил вложение, переписал скрипт написаный на скорую руку, добавил QT += gui в приложение, в плагине оставил с минусом, если что стоит удалить эту строку из .pro файла
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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