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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание и использование DLL  (Прочитано 6502 раз)
rain107
Гость
« : Февраль 27, 2010, 20:06 »

Всем доброго времени суток!

Посоветуйте пожалуйста как правильно создать класс (например MyWidget) и запихнуть его в ДЛЛ... И как правильно этот класс экспортировать в рабочее приложение (желательно динамически)?

С функциями проблем нет, а вот с классами - проблема. ДЛЛ создавал так:
dll_test1.h
Код:
#ifndef DLL_TEST1_H
#define DLL_TEST1_H

#include <QString>
extern "C" {
    QString oddUpper(const QString& str);
    int countOfChars (const QString& str);
}

#endif // DLL_TEST1_H

dll_test1.cpp
Код:
#include "dll_test1.h"

QString oddUpper(const QString& str)
{
    QString strTemp;
    for (int i = 0; i < str.length(); ++i) {
        strTemp += (i % 2) ? str.at(i) : str.at(i).toUpper() ;
    }
    return strTemp;
}

int countOfChars(const QString& str)
{
    return str.count();
}

dll_test1.pro
Код:
TEMPLATE = lib
DESTDIR = ..
QT -= gui
SOURCES = dll_test1.cpp
HEADERS = dll_test1.h
TARGET = dll_test1

Использовал ДЛЛ так:
Код:
#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

QLabel lbl("this is the example text ");
QLibrary my_lib("dll_test1");
typedef QString (*FunctionRef) (const QString&);
typedef int (*CountRef) (const QString&);
FunctionRef fr = (FunctionRef) (my_lib.resolve("oddUpper"));
CountRef cr = (CountRef) (my_lib.resolve("countOfChars"));
if (fr){
    lbl.setText(fr(lbl.text()));
}
int x;
if(cr)
    x = cr(lbl.text());
x = x+1;
lbl.show();
    return a.exec();
}
Записан
BRE
Гость
« Ответ #1 : Февраль 27, 2010, 20:09 »

В assistant есть раздел:
How to Create Qt Plugins
Записан
rain107
Гость
« Ответ #2 : Февраль 27, 2010, 20:11 »

В assistant есть раздел:
How to Create Qt Plugins

Уже смотрел, не очень помогло. Там только плагины:(
Записан
BRE
Гость
« Ответ #3 : Февраль 27, 2010, 20:12 »

А в чем разница между плагином (который в DLL) и DLL?
Записан
rain107
Гость
« Ответ #4 : Февраль 27, 2010, 20:32 »

Был бы очень признателен за маленький пример. А то уже два дня сижу и ничего не могу поделать  Грустный
Записан
BRE
Гость
« Ответ #5 : Февраль 27, 2010, 20:48 »

Поищи по форуму, подобных тем было несколько, пример:
http://www.prog.org.ru/topic_4120_0.html
Записан
rain107
Гость
« Ответ #6 : Февраль 27, 2010, 21:55 »

Да я уже смотрел по форуму перед созданием темы. Там везде идет речь либо об экспорте функций либо о плагинах...
Записан
rain107
Гость
« Ответ #7 : Февраль 27, 2010, 22:02 »

А в чем разница между плагином (который в DLL) и DLL?

Да наверное всетаки есть разница. Как же экспортировать класс который не является плагином, без использования множественного наследования интерфейса? 
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #8 : Февраль 27, 2010, 22:21 »

1) все есть в документации
2) все есть на форуме
3) Qt плагин - это механизм обертки над ПОЛНОСТЬЮ СВОИМ классом для запаковывания его в DLL чтобы потом можно было загрузить его динамически и использовать через QPluginLoader
4) вы не хотите разбираться а хотите чтобы за вас сделали это

Цитировать
Как же экспортировать класс который не является плагином, без использования множественного наследования интерфейса?

Легко! Делаете интерфейс плаш=гина который имеет ф-ю

CMyClass * makeInstance();

грузите свой плагин - через этот интерфейс создаете свой класс который не унаследован ни от каких интерфейсов - и спокойно работаете с ним. Этот способ еще и позволяет создать несколько экземпляров объектов при одном загруженном плагине (просто загружая плагин - он загрузится только 1 раз, даже если принудительно несколько раз вызывать загрузку)!
Записан
BRE
Гость
« Ответ #9 : Февраль 27, 2010, 22:24 »

Класс это абстракция, которая есть в исходном файле и голове программиста, в объектных файлах уже никаких классов нет, есть просто функции "со странными именами".

dll.h
Код
C++ (Qt)
class TestClass
{
public:
void func();
};
 

Dll.cpp
Код
C++ (Qt)
#include "dll.h"
#include <iostream>
 
void TestClass::func()
{
std::cout << "Call func()" << std::endl;
}
 
extern "C" TestClass *buildClass()
{
return new TestClass;
}
 

Собераешь как dll.
А дальше, все как ты делал, загрузил dll, получил указатель на функцию buildClass. С ее помощью создаются объекты. Интерфейс описан в dll.h
Записан
SASA
Гость
« Ответ #10 : Март 02, 2010, 11:34 »

У нас есть вики!
http://www.prog.org.ru/topic_8259_0.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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