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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объясните популярно про DLL  (Прочитано 4960 раз)
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
Читал. вкурил. НО!!! Получается, что приложение, использующее этот ДЛЛ должно знать о нем заранее, и иметь в .pro файле строки:
Код
C++ (Qt)
DEPENDPATH += ../dll
INCLUDEPATH += ../dll
LIBS += -L../../lib -ldlabel
 

Но что делать если мое приложение вообще никак не может знать, какие ДЛЛ могут быть в него подгружены? с учетом что подгружать нужно классы! Объясните бестолковому, может как-то правильно надо использовать QPlugin? только как?
Записан
Странник
Гость
« Ответ #1 : Ноябрь 03, 2011, 10:11 »

приложение должно знать заранее об используемых динамических библиотеках и без них не запустится.
о плагинах приложение может и не знать, и прекрасно запускается без них.
вам нужны, разумеется, плагины. подробнее в документации.
Записан
b-s-a
Гость
« Ответ #2 : Ноябрь 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).
Когда делают плагины, то они знают структуру всей программы и имеют доступ к интерфейсу управления ей. Программа же знает только базовую функциональность плагинов: типа получить виджет конфигуратора и обработать данные (если плагин не расширяет только функциональность интерфейса)... Когда программа загружает плагин, она импортирует функции создания экземпляров имеющихся классов. Создавая класс ему передается указатель на главный класс приложения. Так как на момент создания плагина была известна структура программы, то он легко может сам интегрироваться в нее, добавляя необходимые кнопки и подключаясь к событиям...
Записан
mcrads
Гость
« Ответ #3 : Ноябрь 03, 2011, 13:34 »

Ну вот, теперь понял... b-s-a, спасибо! почитаю документацию по плагинам, может что соображу...
Записан
mcrads
Гость
« Ответ #4 : Ноябрь 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]
 

В чем причина?
Записан
BRE
Гость
« Ответ #5 : Ноябрь 03, 2011, 16:18 »

А ты ему QtPlugin приинклюдь и он перестанет. Улыбающийся
Записан
mcrads
Гость
« Ответ #6 : Ноябрь 03, 2011, 16:32 »

Ок, все собралось, на работу пока не проверял только! Всем огромное спасибо!!
Записан
mcrads
Гость
« Ответ #7 : Ноябрь 03, 2011, 22:04 »

Все работает, еще раз спасибо!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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