Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Dll'ки Qt

Автор: Litkevich Yuriy 10.5.2009, 11:24

Несколько раз напарывался на аварийные завершения программ написаных на Qt в том числе Qt Assistant.
И нашёл этому объяснение.

Дело в том, что у меня стоит несколько версий Qt. Запуск приложений осуществляется с помощью bat-файлов, задающих окружение.

Дак вот положим запустил я свою программу в окружении Qt 4.4.3, а потом решил запустить Qt Assistant (4.5.x) и в момент индексации он валится.
Долго немог понять почему. Если закрываю свою программу, то Асистент работает нормально.

Мой вывод следующий:
Qt***4.dll уже сидит в памяти от 4.4.х, и когда пускается Асистент 4.5.х, то виндовоз ему говорит, что нужная dll'ка уже загружена и находится тут. А там dll'ка предыдущей версии.

вот я и думаю, а как вообще будут уживаться вместе разные проги в дистрибутиве которых есть Qt dll'ки?

может пофилосовствуем на эту тему?

Автор: SABROG 10.5.2009, 13:09

Цитата(Litkevich Yuriy @ 10.5.2009, 12:24) *
Дак вот положим запустил я свою программу в окружении Qt 4.4.3, а потом решил запустить Qt Assistant (4.5.x) и в момент индексации он валится.


А Assistant 4.5.x тоже запускается в окружении Qt 4.4.3 ?

Автор: Litkevich Yuriy 10.5.2009, 13:33

Цитата(SABROG @ 10.5.2009, 17:09) *
А Assistant 4.5.x тоже запускается в окружении Qt 4.4.3 ?
нет, просто в проводнике, или через кнопку "Пуск" запускаю бинарь. Дело в том, что dll'ка с нужным именем уже загружена в память.

Автор: Гость 10.5.2009, 14:31

Цитата(Litkevich Yuriy @ 10.5.2009, 13:33) *
нет, просто в проводнике, или через кнопку "Пуск" запускаю бинарь. Дело в том, что dll'ка с нужным именем уже загружена в память.

сначала нужно найти ее на диске, потом проверить что загружена именно та, с учетом пути

Автор: SABROG 10.5.2009, 15:15

dependency walker вроде как показывает пути к дллкам.

Автор: Litkevich Yuriy 10.5.2009, 16:06

Цитата(Гость_Гость_* @ 10.5.2009, 18:31) *
загружена именно та, с учетом пути
Т.е. путь к dll'ке Виндовоз учитывает?

Автор: Гость 10.5.2009, 20:49

Цитата(Litkevich Yuriy @ 10.5.2009, 16:06) *
Т.е. путь к dll'ке Виндовоз учитывает?

допустим записали в 2 директории ехе файл в одну с длл в другую без, при запущенном первом второй как не запускался, так и не будет запускаться. Вроде так в первом приближении задачи независимы. Каждая ДЛЛ при загрузке проходит через ДллМаин правда есть секции с атрибутом SHARED http://rosigma.com/91.aspx Книга толстая :dance2: Такие секции нужны что белать всякие межпроцесные взаимодействия типа ActiveQt

надо dependency walker поглядеть, может там мешанина из версий грузится, обычно на диске полно копий

Автор: Litkevich Yuriy 10.5.2009, 21:11

Цитата(Гость_Гость_* @ 11.5.2009, 0:49) *
надо dependency walker поглядеть, может там мешанина из версий грузится, обычно на диске полно копий
погляжу как энтузиазм появится.
поидее если я запускаю Асистент через кнопку "Пуск", и рядом с асистеном лежат dll'ки, то виндовоз ищет их начиная с текущего каталога приложения. И, коль ему путь не безразличен, должен подгружать ту, что рядом лежит.

Я-то думал виндовоз только имя самой dll'ки смотрит. Тогда получается мешанины быть недолжно. Т.е. в память должны грузится, например, QtCore4.dll и QtCore4.dll, только с разных путей.

Автор: Гость 10.5.2009, 23:46

актуальные длл покажет дллексплорер Русиновича http://Sysinternals.com правда он командная строка, нужно в файл переправить

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)