![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 22
|
![]()
Доброго всем дня.
Вопрос сложный. Решения я найти не смог, кроме "костыля", но он мне не очень нравится. Прошу советов у сообщества. Вводные данные: Есть библиотека. Голая. Считайте скелет. Есть только экспорт необходимых вызываемому софту функций. Все функции "пустые". Там просто стоит result:=0; Вызываемый софт защищен протектором Obsidium. Это важно. В секции uses DLL только System.SysUtils,System.Classes, Winapi.Windows Софт по нажатию кнопки в себе, вызывает библу. Вызывает пару функций в ней. Выгружает библу и остается работать - ждать дальнейших действий. Если нажать кнопку еще раз в софте - действие повторится. Загрузка библы. Функции. Выгрузки. Так можно делать бесконечно. Теперь создадим ситуацию "гибели" софта. Например я хочу, чтобы библа при выполнении какой-либо функции, выдала на экран что-нибудь через например MessageDlg. Чтобы сделать это, мне как минимум нужно добавить в uses -> Dialogs Ок. Добавляем. Но при этом НЕ ДОБАВЛЯЕМ в код вывод каких-либо диалоговых окон. То есть мы ничего с голой библой не делали, никакого кода, кроме как добавили в uses Dialogs Компилируем библу и запускаем софт. Софт запускается. Нажимаем кнопку, выполняются функции, софт выгружает библу и крашится сам. Насколько я понимаю... Добавление в uses Dialogs (так же ведет себя добавление Vcl.Forms, Vcl.Graphics и тд) заставляет при загрузке библиотеки, проинитить хренову тучу дополнительных поинтеров, памяти и всего чего угодно из Dialogs и сидящих у него в его uses еще кучи инклудов. А на выгрузке библы, что-то видимо не освобождается и это "что-то" крашит защиту приложения, которая очень ревностно относится когда приложение что-то открыло, но забыло это закрыть\освободить. В итоге патовая ситуация... Однако можно пойти на хитрость. Он же "костыль"=) Можно открыть свою DLL из своей же DLL=) То есть софт грузит мою DLL. Я внутри своей DLL делаю на нее же LoadLibriary(....), а потом при выгрузке естественно FreeLibriary Такой "ход конем" спасает ситуацию и софте не крашится... Но мне это не нра.... А понять как освободить то, что создалось при добавлении uses Dialogs я скорее всего не смогу, да и не уверен что это вообще как-либо возможно... Загрузка такой библы любым софтом БЕЗ каких-либо протекторов не влечет за собой никаких проблем. Все работает штатно. Можно добавлять все что угодно. И диалоги и формы и вообще все. Все загружается и выгружается. Никаких AV и прочих бед. Я понимаю что можно сказать - это к разработчику защиты... Но увы такой вариант не подходит... Может быть кто-то проходил? Ну вдруг=) |
![]() |
![]() |
![]() |
#2 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,810
|
![]()
А если убрать FreeLibriary? Ну чтобы проверить, что проблема происходит именно во время выгрузки.
Также можно задать DLLProc с обработкой DLL_PROCESS_DETACH и проверить, дойдет ли выполнение до этого момента или нет. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 22
|
![]()
Обработчик конечно есть
Если убрать загрузку моей библы из моей же - софта крашится. пробовал в DETACH ставить ну там запись в логи... есть запись. То есть до него дело доходит. Код:
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Прошу совета | BESTia | Фриланс | 1 | 01.12.2021 16:39 |
ПРОШУ СОВЕТА ! | КАПИТОЛИНА | Свободное общение | 3 | 21.01.2012 20:46 |
Прошу совета ! | Kamelli_13 | Общие вопросы Delphi | 1 | 18.05.2009 22:10 |
прошу совета мо монитору | andrey_tmn | Компьютерное железо | 4 | 18.03.2009 20:03 |