| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Проблема с загрузкой .dll |
| Автор: ftooper 17.4.2011, 08:19 | ||
С помощью
загружаю дллку в мой файл. Потом эта длл таким же образом пытается загрузить ещё одну длл, но 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 | ||||
Это понятно
А это не очень... Вторая длл на момент запуска первой может и не существовать, и появится значительно позже первой... например я загружаю первую длл. Через час появляется вторая длл(и первая узнаёт её имя), и первой нужно воспользоваться функциями второй и ещё один момент, в длл2 есть функции которые используют Глобальные переменные этой длл, и есть поток. То есть работает поток, меняет значения переменных, а фукции при вызове получают значения этих переменных, делают некоторые действия с ними, и возвращают результат. Сомневаюсь что external мне поможет... Какие есть ещё варианты? |
| Автор: ftooper 18.4.2011, 08:34 |
| delete |
| Автор: bems 18.4.2011, 10:59 |
| в отдельном потоке загрузка второй длл должна работать, потому что поток начнет работу уже после выхода из dllmain. проблема в чем-то другом. Что возвращает GetLastError? |
| Автор: ftooper 18.4.2011, 17:08 | ||
Возвращает ноль. Самое странное то, что если код длл поместить в exe, то есть прописать вместо library program, то всё работает. Но суть задачи в том, чтобы заставить этот код работать именно так, как я описал выше... То есть заставить выполняться код второй длл при загрузке из первой. |
| Автор: ftooper 18.4.2011, 21:38 |
| Всё дело в аспаке... длл2 запакована аспаком... Без аспака работает, с ним нет. Но если без первой, сразу грузить вторую то и аспак не помеха... В чём дело? Почему так? |