Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > dll динамическое подключение


Автор: ALXP 9.7.2008, 14:27
Столкнулся с траблой АААААААААА  smile  smile 

Проблема вот в чем. Создал ДЛЛ в Студии2005, ДИНАМИЧЕСКИ ПОДКЛЮЧАЮ К ПРОЭКТУ
в билдере.

Код

HMODULE hLibHandle = LoadLibrary("MyDll.dll");


Меня волнует только hLibHandle  smile 

ВСЕ РАБОТАЕТ ПРЕКРАСНО , hLibHandle при запуске проги получает хендл на мою ДЛЛ,
и далее я проверяю 
Код

if ( hLibHandle )
 то соответственно выполняю функции из ДЛЛ,

 НО ЭТО ПРОИСХОДИТ ТОЛЬКО В ЭТОЙ ВИНДЕ ГДЕ Я ПИШУ КОД.

Я не использую lib, мне это не надо. Только динамически беру файл длл и беру из него функции

Взял получивхийся экзешник(нормально скомпиленый не требующих модулей и т.п.) и свою ДЛЛ.
Кидаю в любую папку и запускаю прогу, длл берется и выполняется.

Беру эту папку и копирую на пругой комп, запускаю там, прога работает ничего не требует,
но как только нажимаю кнопоску чтобы подключилась длл, ХЕНДЛ не создается, он НУЛЛ.

Что можно с этим сделать. Почему LoadLibrary на других машинах не возвращает хендл длл?????




Автор: Lazin 9.7.2008, 14:35
Цитата(ALXP @  9.7.2008,  14:27 Найти цитируемый пост)
Беру эту папку и копирую на пругой комп, запускаю там, прога работает ничего не требует,
но как только нажимаю кнопоску чтобы подключилась длл, ХЕНДЛ не создается, он НУЛЛ.

это потому-что dll зависит от runtime library, при попытке загрузить библиотеку, сначала загружаются библиотеки из таблицы импорта, если что-то загрузить не удается библиотека не загружается, установи на другом компе visual studio redistributable package, либо используй статическую компоновку (ProjectPropertys - C++ - Code Generation - Runtime Library - Multitraded(debug) library)

Автор: ALXP 9.7.2008, 14:55
Спасибо. Так теперь чтобы разобраться.

1) Я пишу на билдере. 

2) (ProjectPropertys - C++ - Code Generation - Runtime Library - Multitraded(debug) library) так понимаю мне надо установить в студии и скомпилить заново ДЛЛ? ТАК?

3) visual studio redistributable package - это типа пакетик, но где его взять, с сайта мелкомягких?
и если выполнить пункт 2) то 3) делать ненадо ???

4) Делая пункт 2) в настройке увидел такую штуку 
   Multi-threaded (/MT)
   Multi-threaded Debug (/MTd)
   Multi-threaded DLL (/MD) - то что у меня стояло
   Multi-threaded Debug DLL (/MDd) - это то что надо выбрать ТАК?

Автор: ALXP 9.7.2008, 15:17
Скачал visual studio redistributable package для студии 2005 не SP1

Скомпилил ДЛЛ с тем параметром , не помогло . 

 smile  Куда еще смотреть? что ставить? чтобы ДЛЛ ничего не требовала кроме себя любимой?

Автор: Lazin 9.7.2008, 15:32
Цитата(ALXP @  9.7.2008,  14:55 Найти цитируемый пост)
2) (ProjectPropertys - C++ - Code Generation - Runtime Library - Multitraded(debug) library) так понимаю мне надо установить в студии и скомпилить заново ДЛЛ? ТАК?


нужно скомпилить с параметром Multi-threaded (/MT) или (/MTd) для дебажной версии

Multi-threaded (/MT) - статическая компоновка
Multi-threaded Debug (/MTd) - статическая отладочная версия библиотеки
Multi-threaded DLL (/MD) - динамическая библиотека
Multi-threaded Debug DLL (/MDd) - динамическая отладочная версия runtime библиотеки

Добавлено через 2 минуты и 2 секунды
кстати, возможно DLL тянет за собой еще что-нибудь кроме rtl

Автор: ALXP 10.7.2008, 08:20
 smile  Да Lazin спасибо вам огромное. Делаю МТ и посмотрел что там прописались два либа мне ненужных. 

Я удалил эти либы из линкера и собрал MD все заработало после установки redistrib 2005 пакета.

Посмотрел в таблицу импорта MT, да все грузится внутрь dll  smile 

Спасибо задача решена  smile  smile  smile  smile  smile  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)