Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: глобальные переменные в HOOKе  (Прочитано 8481 раз)
0 Пользователей и 1 Гость смотрят эту тему.
_EvG_
Гость
« : 25-12-2003 10:12 » 

Уважаемые господа! Возникла следующая проблема:

Пишу клавиатурный хук, в нем объявляется некоторая глобальная переменная, которая инициализируется при загрузке dll. Но после этого в HOOKPROCе значение этой переменной совершенно другое. Покопался поглубже - у переменной МЕНЯЕТСЯ АДРЕС!  Я шокирован! Причем этот адрес зависит от того, какое приложение активно в данный момент. Может, кто-нибудь объяснит, в чем тут дело, и как эту проблему обойти?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 26-12-2003 06:44 » 

Вообще там есть директива задающая по какому адресу загружать DLL.
см. $IMAGEBASE
Записан

while (8==8)
Coreolis
Гость
« Ответ #2 : 22-02-2004 09:29 » 

Меня тоже это вопрос интересует! И здесь дело даже не в HOOKе, просто когда библиотеку очередной раз вызывает какое-то приложение, под переменные этой библиотеки заново отводится памать. И вопрос EvG можно задать и так:
Каким образом обозначить глобальные переменные в библиотеке, видимые для всех её клиентов, причём при изменении любым клиентом этой переменной для остальных она тоже менялась(т.е. физически это одни и теже переменные).
  Когда у меня возникла такая необходимость, я сделал просто - через реестр. Но это не есть гуд. Наверняка есть более грамотный выход...

ЗЫ:
sss - ты вообще, о чём? "там" - это где? где смотреть? Улыбаюсь
Пожалуйста, изъяснись подробней.
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #3 : 23-02-2004 08:51 » 

Уважаемые,  мне как-то неудобно повторять общеизвестные истины, но каждый процесс под Windows обладает собственным адресным пространством, и dll, загружаемая отдельным процессом, является частью этого процесса и адресного пространства, неважно, что при этом используется код, уже загруженный в физическую память. И поэтому изменение переменной в одном процессе никак не может изменять переменные в другом процессе, если эти переменные не объекты ядра, или не часть разделяемой памяти.
Записан
Dobro
Гость
« Ответ #4 : 23-02-2004 10:23 » 

К вопросу об общеизвестных истинах - нет правил без исключений. Потому как имеется возможность разделять данные dll, загруженной в разные процессы. И сделано это было, скорее всего, именно для хуков.
Для этого используются именованные разделяемые сегменты, которые объявляются при помощи директивы
#pragma data_seg.
Более подробную информацию можно найти в Knowledge Base Articles MSDN в статье:
HOWTO: Share Data Between Different Mappings of a DLL
Q125677
Записан
Coreolis
Гость
« Ответ #5 : 24-02-2004 08:33 » 

Dobro: СПАСИБА! Обяз посмотрю и изучу Улыбаюсь

=============================================
Diletant, если тебе "Неудобно повторять истины" то зачем ты их повторяешь?!?
Невнимательно вопросы читал?
Все говорят: Под переменные отводятся разные пространства.
Тут же спрашивают: КАК сделать общие переменные.

а ты не в тему, да ещё с издёвкой говоришь всем то, что и так уже ясно:
под переменные отводятся разные пространства.

За сим усё.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines