Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взаимодействие DLL между собой и с EXE [D1, D2, D3, D4, D5, D6, Win95/98, WinME, NT4, Win2k]


AlexandrN ©   (2002-11-23 11:59:00) 

Привет всем, кто сейчас присутствует...
Программеры помогите мне...
У меня есть EXE(основная прога), который динамически грузит некий набор DLL.
Если кто знает или предпологает, то подскажите как правильно можно вызвать функции(процедуры) загруженные основной прогой из разных DLL в любой из загруженных DLL.
Типа :
Загрузили MyDLL и TestDLL, в основной программе.
Вызываем из MyDLL функции которые реализованы в TestDLL.

А так же кто нибудь знает, как из любой динамически загружаемой DLL, получить доступ к компонентам расположенным в основной программе.

P.S. >> Огромное спасибо всем кто ответит...


NailS   (2002-11-25 13:53:00) [1]


> AlexandrN (23.11.02 14:14)
> Но решение уже нашёл.

Так поделись решением-то.
Или это комерческая тайна ? ;)


AlexandrN   (2002-11-23 14:14:00) [2]

Полностью с вами согласен.
Но решение уже нашёл.


Юрий Зотов   (2002-11-23 14:14:00) [3]

Еще вариант (наверное, лучший). Поместите все совместно используемые типы, объекты и прочее в BPL, а Exe и все DLL компилируйте с этим run-time пакетом.


AlexandrN   (2002-11-23 14:14:00) [4]

Полностью с вами согласен.
Но решение уже нашёл.

Все принимавшим участие большое спасибо.


Юрий Зотов   (2002-11-23 14:11:00) [5]

Ну так а что же Вы хотели, батенька? Конечно, DLL должна знать то, с чем она работает.

Но! Если Вы все равно грузите все DLL разом, то почему бы не использовать статическую загрузку? Тогда один (или не один, это неважно) интерфейсный модуль решает все проблемы.


AlexandrN   (2002-11-23 14:09:00) [6]

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


Anatoly Podgoretsky   (2002-11-23 14:07:00) [7]

Лень что ли?


AlexandrN   (2002-11-23 14:04:00) [8]

Разницы никакой если, в DLL импортировать все типы данных и описания объектов используемых в другий DLL или EXE, чего делать очень нехочется...


Юрий Зотов   (2002-11-23 13:53:00) [9]

> А мне бы хотельсь после этого, просто вызывать уже загруженные
> функции в других DLL где надо..

Ну и вызывайте себе преспокойно, самым обычным образом.

1. LoadLibrary
Если DLL уже загружена, повторной загрузки не произойдет, функция просто вернет ее хэндл. Можно использовать и GetModuleHandle, получите тот же хэндл.

2. GetProcAddress

3. Вызов с приведением типа.

Все точно так же, как Вы делаете в Exe. Никакой разницы.


AlexandrN   (2002-11-23 13:46:00) [10]

Но я же загружаю все DLL в EXE и там же инициализупую функции.
А мне бы хотельсь после этого, просто вызывать уже загруженные функции в других DLL где надо..

И загружаю, я DLL - динамически.


Юрий Зотов   (2002-11-23 13:42:00) [11]

Предположим, я пишу DLL, а в ней вызываю API-шную CreateWindow. Все нормально, никакого криминала, верно? А ведь CreateWindow - это функция из User32.dll. И системе абсолютно без разницы, кто эту dll написал - Microsoft или мы с Вами.

Вот и поступите так же. Если нужна статическая загрузка - напишите для Ваших DLL свой интерфейсный модуль по образцу Windows.pas и используйте этот модуль в Exe, в DLL и вообще где угодно.

Если же нужна динамическая загрузка, то используйте стандартный механизм: GetProcAddress и вызов с приведением типа к нужному.


AlexandrN   (2002-11-23 13:31:00) [12]

>Юрий...
Зачем мне грузить повторно DLL, если они все грузяться при инициализации EXE.
А вот про GetProcessAddres - который может вызвать функцию из другой DLL, которая уже загружена, мог бы пояснить, каким это образом...
Передавать, чтоли весь список загруженных функций(даже с ненужными) или как.


AlexandrN   (2002-11-23 13:27:00) [13]

Согласен по поводу "Как должен звучать вопрос", но спасибо и на том...

Закрыаю тему, вопроса так как решение уже нашлось, с людьми обитающими на RSDN...


Юрий Зотов   (2002-11-23 13:27:00) [14]

Функция DLL спокойно может вызвать функцию из другой DLL через обычное GetProcAddress (а если требуется, то и загрузить эту DLL обычным LoadLibrary). Все точно так же, как и при вызове из Exe.


Cobalt   (2002-11-23 13:19:00) [15]

1)Из "любой" не получиться. Она должна быть под это заточена. Т.е. либо она должна получать некий callback-адрес, либо, скажем, имя ДЛЛ-ки и имя ф-ии требуемого ей типа
2)Вопрос, конечно, должен звучать так: "Как из моейдлл-ки получить доступ к компонентам из моей проги?"


Наверх

Титульная страница Поиск, карта сайта Написать письмо