Russian Qt Forum

Qt => Общие вопросы => Тема начата: FAngel от Сентябрь 13, 2010, 22:27



Название: DllMain Wrapper
Отправлено: FAngel от Сентябрь 13, 2010, 22:27
Доброго времени суток!
Передо мной стоит задача оформить некоторые исходники в виде динамически загружаемой библиотеки. Библиотека должна быть переносимой и собираться под Windows и Mac в разные сущности. На сколько я знаю у QT проблем с этой задачей нету. Однако меня интересует некто вроде метода DllMain, а именно нечто кроссплатформеное, что будет дергаться при загрузке библиотеки.
Вопрос : есть ли какой-нибудь врапер внутрях QT, или придется городить колбасу #ifdef...#endif ?

Заранее спасибо.


Название: Re: DllMain Wrapper
Отправлено: Авварон от Сентябрь 13, 2010, 22:35
зачем вам городить всякие иниты, если есть QPluginLoader, позволяющий получить целиком класс?


Название: Re: DllMain Wrapper
Отправлено: Blackwanderer от Сентябрь 14, 2010, 06:52
Цитировать
зачем вам городить всякие иниты, если есть QPluginLoader, позволяющий получить целиком класс?
Это для плагинов. Обычную библиотеку просто линкуешь и все. Подключаешь заголовочные файлы и пользуешься всем, что написано в библиотеке точно так же, как если бы это было написано в основной программе. В самой библиотеке нужно лишь пометить нужные функции/классы как Q_DECL_EXPORT/Q_DECL_IMPORT. Обо всем остальном позаботится Qt.


Название: Re: DllMain Wrapper
Отправлено: Авварон от Сентябрь 14, 2010, 10:05
а, понял, ступил)
в общем в Qt есть макросы для инита статик переменных, если мне не изменяет память, то там есть макрос, зовущий указанную в нем ф-ию при лоаде либы


Название: Re: DllMain Wrapper
Отправлено: FAngel от Сентябрь 14, 2010, 10:10
Вы меня не правильно поняли. Как экспортировать функции, классы я знаю. Мне нужно что бы при загрузке длл вызывалась некоторая функция, которая будет проводить некоторую инициализацию. То есть что бы не я дергал нечто, а что бы нечто вызывалось само при загрузке длл в память.

В частности опишу задачу. Есть некоторая длл представляющая собой аудио плагин формата vst. Данный плагин грузиться хостом, который дергает определенные функции. Однако при загрузке длл мне нужно произвести плаформенно зависимую инициализацию, к примеру. Под виндой это можно сделать в функции DllMain. Но плагин будет так же компилиться под Mac и возможно, если стандартизируют VST под Linux, то и под Linux.

Собственно повторно вопрос. Есть ли у Qt врапер над входной функций Dll (и аналогов под другими системами).


Название: Re: DllMain Wrapper
Отправлено: FAngel от Сентябрь 14, 2010, 10:10
а, понял, ступил)
в общем в Qt есть макросы для инита статик переменных, если мне не изменяет память, то там есть макрос, зовущий указанную в нем ф-ию при лоаде либы

Отлично! Это именно то что нужно. А имя макроса не подскажете?


Название: Re: DllMain Wrapper
Отправлено: FAngel от Сентябрь 17, 2010, 16:39
Неужто никто не знает как зовется этот макрос?


Название: Re: DllMain Wrapper
Отправлено: Авварон от Сентябрь 17, 2010, 19:27
ну пример с ними я продолбал:)


Название: Re: DllMain Wrapper
Отправлено: SASA от Сентябрь 20, 2010, 10:45
Как подгружается dll?
Если подгружается динамически, то используйте созданный для этого механизм плагинов.
Если статически (сразу залинковона), то прям в мейне вызовете эту функцию
например:

Код:
//dll
void Q_DECL_EXPORT/Q_DECL_IMPORT init()
{
   ...
}

//app
int main()
{
   init();
   ...
}