Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблема с загрузкой .dll


Автор: ftooper 17.4.2011, 08:19
С помощью 
Код

DLLI:=LoadLibrary(name);

загружаю дллку в мой файл. Потом эта длл таким же образом пытается загрузить ещё одну длл, но DLLI:=0, почему такое происходит, и как загрузить из длл другую длл?

Путь до дллки 100% верный.

Автор: 504GateWay 17.4.2011, 10:16
 попробуй получить хендл файла через CreateFile
 если не сможеш, то что-то у него с путем или правами у тебя

Автор: ftooper 17.4.2011, 10:20
Если его загружать не из dll, то он загружается.
То есть если делать так
exe загружает dll2
то всё ОК, а если так:
exe загружает dll1, dll1 загружает dll2
то dll2 просто не загружается

Автор: 504GateWay 17.4.2011, 10:24
какой путь передается dll1 для загрузки dll2?

Добавлено через 1 минуту и 10 секунд
хендл файла получается при вызове CreateFile?

Автор: ftooper 17.4.2011, 10:28
exe - C:\1.exe
dll1 - C:\dll1.dll
dll2 - C:\dll2.dll

хендл длл DLLI:=LoadLibrary(name);

exe загружает dll2 - длл загружена, Работает!
exe загружает dll1, dll1 загружает dll2 - длл НЕ загружена, НЕ работает.

Автор: 504GateWay 17.4.2011, 10:31
exe загружает dll1, dll1 читает данные из файла dll2 - данные прочитаны?
с помощью CreateFile, ReadFile

Автор: bems 17.4.2011, 11:45
GetLastError что возвращает?
Уж не в dllmain ли ты загружаешь другую длл? Этого делать нельзя.

Автор: ftooper 17.4.2011, 14:54
я не читаю данные другой длл, мне нужно загрузить в длл другую длл, так же как это делает loadlibrary

Автор: bems 17.4.2011, 17:34
Да читаешь или нет это без разницы. все точки входа в длл выстраиваются системой друг за другом (в пределах процесса), поэтому когда одна длл находится в dllmain (в дельфи это основной блок begin-end длл а также все секции инициализации юнитов), не может быть вызвана dllmain другой длл. А значит она не может быть загружена (потому что чтобы LoadLibrary успешно отработала dllmain должна вернуть успех, в дельфи это значение переменной ExitCode)
можно загрузить только as data file, но тогда ты получишь хендл, но вызывать функции из длл не сможешь

Автор: ftooper 17.4.2011, 19:14
А как можно реализовать загрузку длл?

Автор: bems 17.4.2011, 19:46
Загружать в подходящем для этого месте. Либо связать с первой длл статически

Автор: ftooper 17.4.2011, 20:19
Расскажите пожалуйста как это реализовать(алгоритм)?

Автор: bems 17.4.2011, 22:08
импортировать оттуда функцию с помощью ключевого слова external при объявлении функции. Длл будет загружена "одновременно" с твоей

Автор: ftooper 17.4.2011, 22:32
Цитата

импортировать оттуда функцию с помощью ключевого слова external при объявлении функции.

Это понятно
Цитата

 Длл будет загружена "одновременно" с твоей

А это не очень... 

Вторая длл на момент запуска первой может и не существовать, и появится значительно позже  первой... 
например я загружаю первую длл. Через час появляется вторая длл(и первая узнаёт её имя), и первой нужно воспользоваться функциями второй

и ещё один момент, в длл2 есть функции которые используют Глобальные переменные этой длл, и есть поток. То есть работает поток, меняет значения переменных, а фукции при вызове получают значения этих переменных, делают некоторые действия с ними, и возвращают результат. 
Сомневаюсь что external мне поможет...
Какие есть ещё варианты?

Автор: northener 18.4.2011, 00:39
Цитата(ftooper @  17.4.2011,  22:32 Найти цитируемый пост)
А это не очень... 

Вторая длл на момент запуска первой может и не существовать, и появится значительно позже  первой... 
например я загружаю первую длл. Через час появляется вторая длл(и первая узнаёт её имя), и первой нужно воспользоваться функциями второй

и ещё один момент, в длл2 есть функции которые используют Глобальные переменные этой длл, и есть поток. То есть работает поток, меняет значения переменных, а фукции при вызове получают значения этих переменных, делают некоторые действия с ними, и возвращают результат. 
Сомневаюсь что external мне поможет...
Какие есть ещё варианты?

Вы уже столько напустили туману, что и ответить сложно. Ибо самой задачи вашей мы не знаем.
Но например. Почему бы вам не загружать обе dll в саму вашу программу? Они обе загружались бы в АП вашего процесса и можно было бы как-то организовать взаимодействие между ними. 
Ну и вдобавок. Но строго имхо. Технология DLL разрабатывалась как технология ориентированная на экспорт, а импорт только подразумевался. Статический.

Автор: ftooper 18.4.2011, 08:34
delete

Автор: bems 18.4.2011, 10:59
в отдельном потоке загрузка второй длл должна работать, потому что поток начнет работу уже после выхода из dllmain. проблема в чем-то другом.
Что возвращает GetLastError?

Автор: ftooper 18.4.2011, 17:08
Код

Что возвращает GetLastError

Возвращает ноль.

Самое странное то, что если код длл поместить в exe, то есть прописать вместо library program, то всё работает. 
Но суть задачи в том, чтобы заставить этот код работать именно так, как я описал выше... 
То есть заставить выполняться код второй длл при загрузке из первой.

Автор: ftooper 18.4.2011, 21:38
Всё дело в аспаке... длл2 запакована аспаком... Без аспака работает, с ним нет.
Но если без первой, сразу грузить вторую то и аспак не помеха... В чём дело? Почему так?

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