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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 21:54   #1
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию выгрузка длл

вобщем такая проблемка: я написал свою длл, в которой происходят опред. процесы в ходе всей работы чужей_программы. Подгружаеться моя длл из самой этой проги, тоесть у нее есть конфиг_файл вкотором я указываю путь к свой длл. Таким вот образам чужая программа загружает в свой процес мою длл.
Теперь вопрос: как акуратно выгрузить свою длл(из себя же), чтоб чужая програма не прекратила ход работы.
user_jasser вне форума Ответить с цитированием
Старый 08.03.2009, 00:50   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ну сегодня прям какой-то день извращенцев =) Создать поток в программе, загрузившей DLL, в нём вызвать FreeLibrary.

Сама себя библиотека выгрузить не сможет, т.к. на вершине стека после вызова FreeLibrary останется адрес, указывающий на область памяти, которая уже освобождена (читай "чужая") и вся программа завалится с access violation. Теоретически можно подменить адрес возврата на валидный, но для этого надо перехатывать FreeLibrary.
--
А, кстати, можно "опред. процесы", происходящие в DLL засунуть в ней в отдельный поток, тогда из него же можно будет вызвать FreeLibraryAndExitThread, который завершит поток и корректно выгрузит библиотеку.
пыщь

Последний раз редактировалось JTG; 08.03.2009 в 00:58.
JTG вне форума Ответить с цитированием
Старый 08.03.2009, 01:03   #3
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

JTG
вы собсно разъяснили суть проблемы, а вот решение не совсем:
Цитата:
Создать поток в программе, загрузившей DLL, в нём вызвать FreeLibrary.
я понятие не имею как это зделать, ведь исходников той проги у меня нет..

добавил
FreeLibraryAndExitThread - во это я уже пробывал но у программы проподает главное окно, а процес остаеться, или я чтото не так делал? Зы: второй параметр передовал ноль

Последний раз редактировалось user_jasser; 08.03.2009 в 01:10.
user_jasser вне форума Ответить с цитированием
Старый 08.03.2009, 01:19   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код в dll засунь в отдельный поток

Код:
Procedure Work;
var h: THandle;
Begin
  h := GetModuleHandle('<ИМЯ_БИБЛИОТЕКИ>.dll');
  {...}
  MessageBox(0, 'Здесь что-то делаем', '', 0);
  {...}
  FreeLibraryAndExitThread(h, 0);
end;

var id: cardinal;

begin
  CreateThread(nil, 0, @work, nil, 0, id)
end.
Думаю это будет проще, чем выделять память в чужом процессе и делать CreateRemoteThread
пыщь

Последний раз редактировалось JTG; 08.03.2009 в 01:25.
JTG вне форума Ответить с цитированием
Старый 08.03.2009, 01:38   #5
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

JTG
неа, вылитает с ошибкой "память не может быть read". возможно что в моем коде еще мешает нодо проверять. спсб
user_jasser вне форума Ответить с цитированием
Старый 10.03.2009, 14:02   #6
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

Еще вопросик: вобщем я в своей длл подменяю CallBack ф-ию главного окна чужей_проги..
Код:
OldWindowProc:= SetWindowLong(Handle, GWL_WNDPROC, LongInt(@NewProc));
Дальше, немного поработав, я возвращаю исходную ф-ию окна...
Код:
SetWindowLong(Handle, GWL_WNDPROC, LongInt(@OldWindowProc));
все вроде отлично, и на подменяемую функцию(NewProc) больше не идут сообщения, но вот в момент закрытия программы появляеться казус: ф-ия NewProc наченает активно работать и получать сообщения...
Зы: собсно и из-за этого и происходят верталеты..
Цитата:
вылитает с ошибкой "память не может быть read"
С чем это может быть связано и как исправить?
user_jasser вне форума Ответить с цитированием
Старый 10.03.2009, 14:09   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

в своей оконной функции(NewProc) надо вызывать CallWindowProc.
и привести код в студию ещё не помешает.
rpy3uH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ДЛЛ на gcс Иллидан Общие вопросы C/C++ 1 12.10.2008 22:11
Про формы в длл Altera Общие вопросы Delphi 2 24.06.2008 22:19
Экспорт класса из ДЛЛ SunKnight Общие вопросы Delphi 2 21.05.2008 19:31
Фрэймы из ДЛЛ SunKnight Общие вопросы Delphi 4 06.01.2008 16:32
Использование длл Anatolij Win Api 1 02.01.2007 19:54