Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2023, 23:25   #1
darkleo
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 20
По умолчанию Голая (пустая) DLL крашит софт. Проблема неоднозначна! Прошу совета

Доброго всем дня.
Вопрос сложный. Решения я найти не смог, кроме "костыля", но он мне не очень нравится.
Прошу советов у сообщества.

Вводные данные:
Есть библиотека. Голая. Считайте скелет.
Есть только экспорт необходимых вызываемому софту функций.
Все функции "пустые". Там просто стоит 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 и прочих бед.

Я понимаю что можно сказать - это к разработчику защиты... Но увы такой вариант не подходит...

Может быть кто-то проходил? Ну вдруг=)
darkleo вне форума Ответить с цитированием
Старый 21.11.2023, 23:40   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

А если убрать FreeLibriary? Ну чтобы проверить, что проблема происходит именно во время выгрузки.
Также можно задать DLLProc с обработкой DLL_PROCESS_DETACH и проверить, дойдет ли выполнение до этого момента или нет.
Arigato на форуме Ответить с цитированием
Старый 21.11.2023, 23:53   #3
darkleo
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 20
По умолчанию

Обработчик конечно есть
Если убрать загрузку моей библы из моей же - софта крашится.
пробовал в DETACH ставить ну там запись в логи... есть запись. То есть до него дело доходит.


Код:
procedure DllMain(reason: integer);
  begin
   case reason of
      DLL_PROCESS_ATTACH:
      begin
       libpath:=GetModuleName;
       my_dll:=LoadLibrary(PChar(libpath));
      end;
      DLL_PROCESS_DETACH:
      begin
        FreeLibrary(my_dll);
      end;
    end;
darkleo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу совета 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