Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: mcrads от Ноябрь 03, 2011, 02:12



Название: Объясните популярно про DLL
Отправлено: mcrads от Ноябрь 03, 2011, 02:12
Наверное я тугодум изрядный, но в ходе исследования вопросов по DLL нашел два варианта - динамическая библиотека и плагины. Так вот. Объясните пожалуйста популярно, в чем разница.

И собственно, главный вопрос. http://prog.org.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA (http://prog.org.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA)
Читал. вкурил. НО!!! Получается, что приложение, использующее этот ДЛЛ должно знать о нем заранее, и иметь в .pro файле строки:
Код
C++ (Qt)
DEPENDPATH += ../dll
INCLUDEPATH += ../dll
LIBS += -L../../lib -ldlabel
 

Но что делать если мое приложение вообще никак не может знать, какие ДЛЛ могут быть в него подгружены? с учетом что подгружать нужно классы! Объясните бестолковому, может как-то правильно надо использовать QPlugin? только как?


Название: Re: Объясните популярно про DLL
Отправлено: Странник от Ноябрь 03, 2011, 10:11
приложение должно знать заранее об используемых динамических библиотеках и без них не запустится.
о плагинах приложение может и не знать, и прекрасно запускается без них.
вам нужны, разумеется, плагины. подробнее в документации (http://doc.qt.nokia.com/latest/plugins-howto.html).


Название: Re: Объясните популярно про DLL
Отправлено: b-s-a от Ноябрь 03, 2011, 11:01
Динамическая библиотека содержит в себе функции и данные, которые приложение может использовать. Для этого приложение сначала должно загрузить эту библиотеку, а затем получить указатели на эти функции/данные по известным именам. Например, тебе нужна функция void myfunc(void). Ты делаешь указатель void (*pmyfunc)(void); А затем ему присваиваешь адрес функции из загруженной dll: pmyfunc = (void(*)(void))GetProcAddress(pDll, "myfunc"); Теперь этим указателем можно пользоваться (если, конечно, он не равен NULL): pmyfunc();
Но если тебе необходимо работать с классами из DLL, то тут все хитрее. Во-первых, твоя программа и DLL должны строиться на базе одних и тех же (абстрактных) классов, причем, в DLL только делаются потомки указанных классов без добавления новых публичных методов (вообще-то, добавлять их можно, но приложение о них ничего не узнает и использовать не сможет). Во-вторых, DLL должна предоставлять простые функции создания/удаления экземпляров классов (createMyClass/destroyMyClass).
Когда делают плагины, то они знают структуру всей программы и имеют доступ к интерфейсу управления ей. Программа же знает только базовую функциональность плагинов: типа получить виджет конфигуратора и обработать данные (если плагин не расширяет только функциональность интерфейса)... Когда программа загружает плагин, она импортирует функции создания экземпляров имеющихся классов. Создавая класс ему передается указатель на главный класс приложения. Так как на момент создания плагина была известна структура программы, то он легко может сам интегрироваться в нее, добавляя необходимые кнопки и подключаясь к событиям...


Название: Re: Объясните популярно про DLL
Отправлено: mcrads от Ноябрь 03, 2011, 13:34
Ну вот, теперь понял... b-s-a, спасибо! почитаю документацию по плагинам, может что соображу...


Название: Re: Объясните популярно про DLL
Отправлено: mcrads от Ноябрь 03, 2011, 16:14
Ну вот ( теперь имею следующую ошибку:
Цитировать
D:\qtprojects\LibraryTemplate-build-desktop-Qt_4_7_4__qt_________\..\LibraryTemplate\librarytemplate.cpp:11: ошибка: expected constructor, destructor, or type conversion before '(' token

Ругается на строку
Код
C++ (Qt)
//! [1]
Q_EXPORT_PLUGIN2(librarytemplate, LibraryTemplate);
//! [1]
 

В чем причина?


Название: Re: Объясните популярно про DLL
Отправлено: BRE от Ноябрь 03, 2011, 16:18
А ты ему QtPlugin приинклюдь и он перестанет. :)


Название: Re: Объясните популярно про DLL
Отправлено: mcrads от Ноябрь 03, 2011, 16:32
Ок, все собралось, на работу пока не проверял только! Всем огромное спасибо!!


Название: Re: Объясните популярно про DLL
Отправлено: mcrads от Ноябрь 03, 2011, 22:04
Все работает, еще раз спасибо!!!