![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
MishaUA |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
Доброго времени суток!
Скажите, пожалуйста, есть ли какие либо проблемы или особенности если программа будет загружать одну библиотеку несколько раз? Программа и библиотека написаны на Qt. Программа загружает библиотеку, затем через resolve запрашивает функцию, которая возвращает указатель на Qwidget, добавляет этот виджет на свою форму, затем библиотека работает сама по себе, взаимодействуя с пользователем через этот виджет, а при закрытии программы эта програма запрашивает функцию, которая возвращает QvariantMap с настройками библитоеки. Вроде ничего сложного, но у меня такое впечатление, что если загрузить, к примеру, 2 одинаковых библиотеки (может быть загружено не ограниченое количество) есть какая-то связь между виджетами этих двух библиотек. К примеру, на виджете библиотеки есть кнопка "сохранить", которая записывает некоторые данные в структуру с настройками (а они беруться с внутрениих виджетов библиотеки) и при закрытии программы при вызове с библиотеки функции, которая возвращает QvariantMap, эта функция записывает все настройки в QvariantMap и возвращает его, так вот часто (или постоянно, но в каком порядке не понятно) в QvariantMap записываются те данные, которые должны быть записаны в QvariantMap другой библиотеки. Когда то читал, что dll загружается в оперативу один раз, даже если её загружают несколько программ, я сильно в этом сомневаюсь, но всё же, решил переспросить. Сама библиотека загружается динамически. После загрузки ещё перед запросом qwidget вызывается функция, которая создает QObject, он уже содержит qwidget и т.д. в том числе и функцию, которая возвращает QvariantMap. Как известно, при загрузке динамических библиотек можно вызывать только Си функции, у меня они такие:
После загрузки библиотеки вызывается makeObject, при этом ему передаются настроки модуля (через QVariantMap), функция создает новый объект и записывает его в object. После этого запрашивается widget(). При закрытии программы она вызывает map(). Вот у меня такое ощущение, что map вызывается вообще с другой библиотеки. Не подскажите, в чем может быть проблема? Кстати, если действительно библиотека загружается в оперативу только один раз, даже если я её разружаю 2 и больше раза, тогда может в оперативу загружаются только оти СИшные функции? Тогда бы этим можно было бы объяснить не корректную работу. |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
MishaUA, тебя не должен настораживать факт, того, что Dll загружается один раз. Дело в том что это только исполняемая часть (машинные инструкции) существуют в памяти только в одном экземпляре. экземпляров данных будет столько сколько потребуется твоей программе.
Вряд ли ты задумываешся над тем, что exe-шник (в винде, разумеется) лежащий на диске является и файлом подкачки для него (отсюда ограничение в винде - когда ты не можешь удалить/переместить exe-файл пока он запущен). Другими словами - не отвлекайся на реализацию работы Dll-ок, если, конечно, ты не пишешь свой механизм работы с ними. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 28.2.2025, 5:34 |