![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 16.11.2010
Сообщений: 46
|
![]()
Здравствуйте!
У меня хитрая проблема. Пишу dll, в ней несколько функций, часть относится к установке хука на мышь. Некая MouseHook - соотвественно, обработчик. Библиотека грузится из основного приложения статически. Для взаимодействия длл и основной программы создаю отображение файла в память таким образом: Код:
Код:
Так вот, рабочий код таковым быть перестает (не вызывается), сообщение с куском глобальной информации тоже не вылезает. Никакого краха не происходит, данные даже не портятся, хендлы из отображения непосредственно перед UnmapViewOfFile можно посмотреть/вывести, будут правильные, но обработчик тихо умирает в 100% случаев. Подскажите, пожалуйста, что не так?
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться" |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
помоему вы забыли, что длл с хуком грузится в чужой процесс, и в итоге ваши экспортные функции работают с той длл что подгружена к вам, а не к той что обрабатывает хук в чужом приложении.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 16.11.2010
Сообщений: 46
|
![]()
Ну так я же ведь затем и создал объект файлового отображения (везде примерно это и рекомендуется, кажется):
1) пишу хендлы на страницу памяти 2) обращаюсь туда из длл Откуда бы ни грузилась длл, она будет лезть в универсальное место и что-то делать, считав оттуда данные. До этого функция - перехватчик работала причем (ловила мышь), значит можно было ожидать, что в тех же случаях она вдобавок поработает с глобальными данными. Ан нет, пролет. Это нормально? Я сейчас попытаюсь хендл хука тоже в отображение поместить, но не думаю, что результат будет. // Да, вот ща везде подставил GlobalData^.MouseHook - программа глючит и летит и не закрывается.
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться" Последний раз редактировалось Genco; 08.03.2011 в 23:00. Причина: Попробовал иначе |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
так так так, стоп.
это весь код длл? помните одну вещь, что в другом процессе другой экземпляр длл, и он ничего не знает о том что было сделано в вашем процессе. НИЧЕГО. поэтому идет так: при загрузке получается два экземпляра модуля(не *.pas модуль, а исполняемый модуль) модуль А в вашем процессе, и модуль Б в процессе жертве. действия: 1)вы иницилизуете модуль А, в нем открываете проекцию и заполняете переменные. 2)далее ставите хук и модуль Б начинает работу. 3)в модуле Б все переменные имеют базовое значение, в итоге он не знает ни о проекции открытой в А, ни о глобальный переменных там же. итог обломный. если вам надо чтоб модуль Б при своей инициализации нашел например окно вашей программы(а та через DuplicateHandle передала ему хендл на проекцию ответом на сообщение), то используйте DllEntryPoint. да кстати, хендлы тоже надо корректно переносить с одного процесса в другой. помоему стоит подучить основы организации процессов в Win32, читать Рихтера(разработка эффективных Win32 приложений) главы про ДЛЛ и виртуальное адресное пространство, и помоему еще про процессы пригодится(а советовал бы прочесть всю книгу, ибо я не жалею что потратил на нее время) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 08.03.2011 в 23:16. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 16.11.2010
Сообщений: 46
|
![]()
Точно! Немного подумал и понял, о чем вы. Спасибо большое!!
В промежуточно-отладочном варианте сделал примерно так: Код:
З.Ы. Мда, матчасть и правда возьмусь подтянуть.
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться" Последний раз редактировалось Genco; 09.03.2011 в 01:26. Причина: поправил огрех |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
ReleaseAllHandles отрабатывает в вашем процессе(модуль А) но не в чужом(не в модуле Б)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 16.11.2010
Сообщений: 46
|
![]()
Ну это с одной стороны терпимо, удалить объект достаточно всего 1 раз)
Но... Т.е. грузить динамически строго, чтобы срабатывал DLL_PROCESS_DETACH и было "по науке"?
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться" |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
в чужом процессе да, в своем в принципе можно и в статике оставить, но тогда DLL_PROCESS_DETACH произойдет при уничтожении приложения.
поэтому лучше всетаки динамика, чтоб оно происходило и там и там одинакого. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 16.11.2010
Сообщений: 46
|
![]()
Ещё раз спасибо! Теперь всю систему понял, как писать.
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться" |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Модуль GRAPH портит русский при запуске .exe файла! | Nemo-237 | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 06.03.2011 22:59 |
Excel портит файлы? | Random2 | Софт | 9 | 19.10.2010 16:00 |
Что-то портит операционку | Yura_S | Компьютерное железо | 14 | 17.08.2010 12:48 |
Ошибка при выхове функций Bass.dll из другой DLL | SalasAndriy | Общие вопросы Delphi | 7 | 21.10.2009 23:36 |
Отображение скрытых файлов и папок и отображение розширения всех файлов | beegl | Общие вопросы Delphi | 10 | 14.12.2008 22:02 |