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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как писать dll'ки??  (Прочитано 7935 раз)
QCasper
Гость
« : Октябрь 03, 2005, 16:23 »

Вопрос возможно глупый, и не уместный, но не подскажете где можно взять инфу по написанию плагинов для своих Qt приложений? Т.е. хочется научиться создавать динамически подгружаемые библиотеки, и потом загружать их из своих Qt приложений. Ну и от статических lib'ов тоже не откажусь.
Записан
Kostya
Гость
« Ответ #1 : Октябрь 03, 2005, 17:33 »

Цитата: "QCasper"
Вопрос возможно глупый, и не уместный, но не подскажете где можно взять инфу по написанию плагинов для своих Qt приложений? Т.е. хочется научиться создавать динамически подгружаемые библиотеки, и потом загружать их из своих Qt приложений. Ну и от статических lib'ов тоже не откажусь.


Да все просто в принципе. Вот как это делаю я (Windows, хотя для *nix будет тоже работать):
1. создаю проект в .pro файле ставлю
TEMPLATE = lib
CONFIG += dll
2. Описываю класс в этом проекте такой какой мне надо
3. В заголовчном файле описываю прототип функции для экспорта
Код:

extern "C"
{
Q_EXPORT <мой класс> *<функция для экспорта>(QWidget *_parent<куча своих параметров>);
}

4. пишу начинку функции - очень простую
Код:

<мой класс> *<функция для экспорта>(QWidget *_parent<куча своих параметров>)
{
    <создал экземпляр этого класса - вернул его через return>
}

5. Откомпилил все - получилась DLL
6. В главной проге
Код:

typedef <мой класс> *(*<новый тип данных>)(QWidget *parent,<свои параметры>);
// объявляешь переменную-функцию
<новый тип данных> <функция>;
//загружаешь библиотеку
<функция> = (<новый тип данных>)QLibrary::resolve("имя библиотеки", "<функция для экспорта>");
//и вызываешь получившуюся функцию
<функция>(<параметры>);
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Июнь 23, 2010, 01:22 »

C плагинами это одно (в Шлее есть пример, хотя ещё не проверял), но как надо оформлять код библиотеки, НЕ плагина Qt?

Знаю, что тут нужны какие-то макросы, вот и хотелось бы уточнить какие именно, т.к. в обилии тем посвящённых этим dll советы, в основном, разноплановые и много их очень:

DynLib.h:
Код
C++ (Qt)
#ifndef _DYNLIB_H
#define _DYNLIB_H
#include <QString>
 
class DynLib
{
public:
DynLib();
QString funcTxt();
};
 
#endif /* _DYNLIB_H */
 

DynLib.cpp:
Код
C++ (Qt)
#include "DynLib.h"
 
DynLib::DynLib() { }
 
QString DynLib::funcTxt()
{
return "text";
}
 
 

Код основной программы, к которой подключается данная библиотека:
Код
C++ (Qt)
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
 
QLabel lbl("this is the example text");
 
DynLib lib; <<<--- если с этим, то вылет
 
lbl.show();
 
return app.exec();
}
 

Весь код максимально упростил, чтобы оставить суть.
INCLUDEPATH и LIBS в pro-файле основной программы прописаны правильно, библиотека собирается тоже без каких-либо ошибок (dll и .a-файлы создаются), но в момент запуска основная программа вылетает с:
RUN FAILED (exit value -1 073 741 515, total time: 203ms)
Это, конечно, если оставить в ней строку
DynLib lib;
Собственно, как избавится от вылета - какие именно нужны макросы и где их прописывать?
« Последнее редактирование: Июнь 23, 2010, 01:42 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Июнь 23, 2010, 07:31 »

serg_hd ,

а это читали: http://www.prog.org.ru/topic_8259_0.html  ??
Записан

ArchLinux x86_64 / Win10 64 bit
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Июнь 23, 2010, 11:15 »

вообще-то у Шлее все достаточно доходчиво описано, и пример корректный, если делать по нему, то все получится

у меня по этому примеру все работает, код смотрит в каталог, где должны лежать библиотеки, загружает поочередно все найденные, в загруженной ищет функцию инициализации (ее имя во всех моих подключаемых библиотеках одинаковое), если находит, вызывает ее, если не находит, или функция вернула false, выгружает библиотеку
Записан

2^7-1 == 127, задумайтесь...
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Июнь 23, 2010, 11:30 »

serg_hd ,

а это читали: http://www.prog.org.ru/topic_8259_0.html  ??
Всё читал, а именно по этой ссылке написано:
>>Если необходимо подгрузить класс динамически — лучше оформить его как плагин.
А я и хочу динамически, но не как плагин.

вообще-то у Шлее все достаточно доходчиво описано, и пример корректный, если делать по нему, то все получится
Ничего там не доходчиво, всего лишь как импортировать функцию (и то через QLybrary, хочу без неё) и как писать плагины. Варианта dll не-плагина и содержащей класс вообще нету.
« Последнее редактирование: Июнь 23, 2010, 11:40 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #6 : Июнь 23, 2010, 11:35 »

Нет в dll никаких классов!
Классы - это абстрактные понятия, которые существую в голове разработчика и компилятора.  Улыбающийся
В ОС нет такого понятия, как плагин. Это обычная dll.
Не морочьте себе голову и делайте так, как рекомендуется в assistant. Это самый простой способ.  Подмигивающий
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Июнь 23, 2010, 11:38 »

Я не про длл, а про .h и .cpp файлы для создания dll. Как там рекомендуется, только как плагины наверн?
В ОС нет такого понятия, как плагин. Это обычная dll.
Да это понятно, только в Qt динам. dll оформляются по-своему и называются плагинами, а не так как я привёл пример выше.
« Последнее редактирование: Июнь 23, 2010, 11:48 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Июнь 23, 2010, 14:11 »

в Qt dll, подключаемые на этапе сборки приложения - такие же dll как и все остальные dll из Qt, и совершенно не плагины

поэтому в качестве примера самой dll можно использовать любую dll из комплекта Qt
Записан

2^7-1 == 127, задумайтесь...
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Июнь 23, 2010, 18:16 »

serg_hd ,

а это читали: http://www.prog.org.ru/topic_8259_0.html  ??
Да, именно так у меня код (который выше на неск. постов) и оформлен - за исключением ddll.h. Он мне не нужен, хотя и с ним пробовал, эффект тот же - прога, после компиляции/сборки, с подключённой библиотекой, в момент запуска вылетает.
Наверное что-то с настройками IDE, она такая что может, есть различия в pro-файлах между ней и криатором.
Если exe основной проги просто создать (без запуска), скопировать его в отдельный каталог с dll-кой, то при запуске всё ок, dll свою работу тоже делает.
-----
Итого, ответ на мой вопрос прост - прописать путь к самой dll в PATH, либо указать DLLDESTDIR.
« Последнее редактирование: Июнь 23, 2010, 20:23 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Июнь 24, 2010, 07:58 »

пссс... ну разумеется, exe к dll компоновщик привязал, а при старте она не загружается, потому как ее нигде не видно, и IDE тут ни при чем - для креатора укажите DESTDIR в .pro создания dll чтобы она сразу ложилась туда же, где exe создается
Записан

2^7-1 == 127, задумайтесь...
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #11 : Июнь 24, 2010, 19:04 »

я пишу не в криаторе этом примитивном.

пссс... ну разумеется
так обычно всегда говорят, когда уже не надо)

укажите DESTDIR в .pro создания dll чтобы она сразу ложилась туда же, где exe создается
ну да, я ж и говорю, указать DLLDESTDIR(либо DESTDIR) можно ещё, как вариант.
« Последнее редактирование: Июнь 24, 2010, 19:15 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Июнь 25, 2010, 08:47 »

Цитировать
так обычно всегда говорят, когда уже не надо

да просто "dll должна быть доступна при запуске исполнимого модуля" это такая же аксиома, как "у байта 8 бит", и странно когда разработчики такие ляпы допускают...
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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