Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с загрузкой .dll 
:(
    Опции темы
ftooper
Дата 17.4.2011, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



С помощью 
Код

DLLI:=LoadLibrary(name);

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

Путь до дллки 100% верный.
PM MAIL   Вверх
504GateWay
Дата 17.4.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.4.2011

Репутация: нет
Всего: нет



 попробуй получить хендл файла через CreateFile
 если не сможеш, то что-то у него с путем или правами у тебя
PM MAIL   Вверх
ftooper
Дата 17.4.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) ftooper - 17.4.2011, 10:26
PM MAIL   Вверх
504GateWay
Дата 17.4.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.4.2011

Репутация: нет
Всего: нет



какой путь передается dll1 для загрузки dll2?

Добавлено через 1 минуту и 10 секунд
хендл файла получается при вызове CreateFile?
PM MAIL   Вверх
ftooper
Дата 17.4.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



exe - C:\1.exe
dll1 - C:\dll1.dll
dll2 - C:\dll2.dll

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

exe загружает dll2 - длл загружена, Работает!
exe загружает dll1, dll1 загружает dll2 - длл НЕ загружена, НЕ работает.
PM MAIL   Вверх
504GateWay
Дата 17.4.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.4.2011

Репутация: нет
Всего: нет



exe загружает dll1, dll1 читает данные из файла dll2 - данные прочитаны?
с помощью CreateFile, ReadFile


Это сообщение отредактировал(а) 504GateWay - 17.4.2011, 10:39
PM MAIL   Вверх
bems
Дата 17.4.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



GetLastError что возвращает?
Уж не в dllmain ли ты загружаешь другую длл? Этого делать нельзя.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ftooper
Дата 17.4.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



я не читаю данные другой длл, мне нужно загрузить в длл другую длл, так же как это делает loadlibrary
PM MAIL   Вверх
bems
Дата 17.4.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ftooper
Дата 17.4.2011, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



А как можно реализовать загрузку длл?
PM MAIL   Вверх
bems
Дата 17.4.2011, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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

Это сообщение отредактировал(а) bems - 17.4.2011, 19:46


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ftooper
Дата 17.4.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



Расскажите пожалуйста как это реализовать(алгоритм)?
PM MAIL   Вверх
bems
Дата 17.4.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ftooper
Дата 17.4.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



Цитата

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

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

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

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

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

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

Это сообщение отредактировал(а) ftooper - 17.4.2011, 22:40
PM MAIL   Вверх
northener
Дата 18.4.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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

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

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

Это сообщение отредактировал(а) northener - 18.4.2011, 00:40


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.