![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Mailman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Итак, пусть у нас есть некий проект, состоящий из exe и энного набора динамич библиотек. Многие из библиотек, а также exe вызывают функцию(и) одной dll. Сейчас это происходит статически. Проблема состоит в том, что к процессу приложения подгружается столько экземпляров dll, из скольки модулей она загружалась. Также, соответственно, процедура инициализации dll (между begin и end.) происходит такое же количество раз и каждая часть проекта работает со своим экземпляром.
Вопрос мой состоит в том, как сделать так, чтобы библиотека подгружалась 1 раз или хотя бы инициализировалась один раз (методы обхода этого не предлагать - сам умею). Я видел справку по DllProc, но сам попробовать пока не успел. Можно ли решить вопрос с помощью определения обработчика с помощью DllProc? Если да/нет, то как это сделать? Заранее спасибо. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Это сообщение отредактировал(а) bems - 16.6.2006, 01:28 -------------------- Обижено школьников: 8 |
|||
|
||||
| Mailman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Хм, мысь конечно интересная, но что это меняет? Всё равно DLL_PROCESS_ATTACH вызывается прикаждой подгрузке библ из каждого модуля (... LibraryProc(DLL_PROCESS_ATTACH); ...) Ты же сам так написал. Таким образом количество экземпляров и количество раз инициализации нисколько не изменилось.
ЗЫ Мож я что не так понял? |
|||
|
||||
| Guedda |
|
|||
![]() Подрывник ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3137 Регистрация: 27.12.2005 Где: Ростов-на-Дону Репутация: 14 Всего: 78 |
Как раз таки "да"... Ты видишь, что он проинициализировал в процедуре заново константы DLL_PROCESS_ATTACH & etc... И сделал, как ты можешь видить, их пустыми. -------------------- Ll 2 |
|||
|
||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Guedda
Чет я не понял ниче, можешь коментарии расставить че это за строки, поподробнее... И куда это писать? в библиотеку? |
|||
|
||||
| Mailman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Хм. Как я уже сказал у меня это не сработало.
Guedda, покажи мне плз то место в коде, где он их проинициализировал, может я просто этого не заметил? Добавлено @ 12:37 Да, это писать в библиотеку. Строки след-го содержания - присвоить указателю на обработчик системных вызовов в длл линк на процедуру LibraryProc, вызвать её при инициализации библиотеки. Внутри процедуры - case по случаю того, что же собственно произошло. |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
Может так:
загрузить библиотеку в главном модуле (loadlibrary) во вспомогательные передавать указатель и там находить нужную процедуру (GetProcAddress) возможно получится напрямую адресс передавать (хотя сомнительно) -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| DragonFire |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 14.8.2005 Где: Москва Репутация: нет Всего: 9 |
Хм. А вот это мне нравится. Спасибо, я попробую.
Напрямую... Хм. Не буду спрашивать, как. Просто за этой фразой была идея, или просто мысль такая? Mailman. |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
Идея, не идея так предположение.
Если адресс кода процедуры для всей системы, а не для процесса то может сработать. А для передачи можно много способов придумать. Начиная от банального - в виде параметра функции, до отображаемых файлов и реестра. Добавлено @ 14:54 сообщи о результате, а то самому проверять щас времени нет -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| bems |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
А код который я выше привел это как наглядно и похоже на стиль МС. Нв самом деоле из этого же кода видно, что DLL_PROCESS_ATTACH это и есть то что между begin-end. И виноват в єтом стартовый код длл от дельфей. -------------------- Обижено школьников: 8 |
||||||
|
|||||||
| Mailman |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Ты не прав. При старте приложения все модули загрузили библиотеку. Она проинициализировалась много раз.
С этим согласен. Таким образом это подтверждает нерабочесть данного метода. drkot, спасибо, я просто сразу не понял, что ты имел ввиду адрес процедуры полученный (GetProcAddress). Я попробую, тебе в ПМ напишу. Всё, мои вопросы кончились, спасибо всем. |
||||
|
|||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Ты уверен в этом? LoadLibrary в адресное пространство загружает только одну копию DLL. -------------------- |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
скорее всего проблема не в количестве загруженных копий библиотеки (она должна быть одна, есди винда не глючит
думаю они только начались. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
А где они повторно инициализируются? Что вызывает LoadLibrary при повторном обращении к той же длл? Мне такие точки входа неизвестны. и мне так кажется -------------------- Обижено школьников: 8 |
|||
|
||||
| Mailman |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Нет нет нет.
Во первых, То, что к ней первый раз обращаются из некоего исполняемого файла (dll или exe) Во вторых,
Ну, у примеру посмотрел в своём таск менеджере. Во вторых при инициализации я пишу на консоль строку, я читать умею, как она пишется 3 раза. =) В третьих,
Да. Только вот статически или динамически, но LoadLibrary вызывается из каждого модуля по разу.
Нет, но по-моему это так. Теперь это и не важно. Хотя по теории я прав. И наконец, я воспользовался методом drkotа. Спасибо огромное за помощь. Да, указатель на функцию или процедуру по ходу глобален, так он удачно передаётся из 1й длл в exe, а exe спокойно выполняет функцию. Ещё раз спасибо большое. Я закончил. Для тех, кому интересно - просто пример кода: Библиотека:
EXE:
Вот собственно и решение проблемы. Дальше - архетиктурный момент моей системы, но с этим я уже всё придумал и успешно реализую. Удачи. |
||||||||||
|
|||||||||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Если не трудно, приведи пожалуйста кусочек кода, который загружает ДЛЛ в одно адресно пространство дважды
-------------------- Обижено школьников: 8 |
|||
|
||||
| Mailman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Procedure DoLog; external <path>;
Dll1: DoLog Dll2: DoLog Добавлено @ 22:09 А кто говорил про одно адресное пространство? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Один процесс - одно адресное пространство -------------------- Обижено школьников: 8 |
|||
|
||||
| Mailman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.6.2006 Репутация: нет Всего: нет |
Итак, да будет это итогом.
DelphiHelp:
Мой код работает. Но до поры до времени. Соответственно вопросов больше нет. Добавлено @ 01:49 В дополнение хочется извиниться и сказать, что на самом деле вся эта мура была не нужна. В случае объявления функций не статически, а динамически всё подгружается всего один раз и работает как часики. Вот так в 2:49 начался мой денёк. Всем удачи. Это сообщение отредактировал(а) Mailman - 19.6.2006, 01:39 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |