Здравствуйте DenisII, вы писали:
DII>Глобальные переменные в HOOKPROC равны нулю. DII>В любой другой процедуре все ОК. DII>Как быть?
Не плохо было бы посмотреть код. Пришли в голову две причины появления этих глюков:
1.
Если HOOKPROC и остальные функции находятся в разных юнитах, то надо описать переменные при помощи extern. Тогда переменные будут видны из всех юнитов одинаково.
2.
Может быть инициализируются переменные после установки HOOK, тогда тоже можно понять.
Здравствуйте Alex, вы писали:
A>1. A>Если HOOKPROC и остальные функции находятся в разных юнитах, то надо описать переменные при помощи extern. Тогда переменные будут видны из всех юнитов одинаково.
Как раз моя HookProc и переменные, которые мне нужны в ней, объявлены в одном юните. Инициализирую переменные сразу после подключения h-файлов. Потом, в процессе работы программы, значения этих переменных изменяются.
A>2. A>Может быть инициализируются переменные после установки HOOK, тогда тоже можно понять.
Здравствуйте Alex, вы писали:
A>Хотелось бы код посмотреть:))
Весь код наверное смысла нет приводить..
Поэтому вот кусочки..
#include "main.h"
...
int Count = 0; !!!
...
bool SetHook();
bool UnHookHook();
long HookProc(int code, WORD wParam, long lParam);
HHOOK ourhook = NULL;
...
int OpenFile(some parameters)
{
// Идет присвоение перед вызовом HookProc
Count = 5;
}
...
long HookProc(int code, WORD wParam, long lParam)
{
// Маска на 30-й бит lParam if (mask == 0) -> KeyUp
if (lParam & 0x40000000)return 0;
if (!Count)return 0; // !!! Тут должен быть не 0
}
Так я попробовал, но результат такой же.. :(
A>Если не поможет, то можно попробовать ставить HOOK не из функции OpenFile, а вот так (работоспособный пример):
Я ставлю hook не из функции OpenFile(), а после ее вызова при создании главного окна программы..
Спасибо большое за помощь.. Я обязательно попробую, хотя мне кажется, что я нашел решение своей проблемы.. :) Непонятно только следующее.. При создании окна я запоминаю текущий каталог (например, "D:\users"), а при вызове HookProc текущим каталогом является "C:\windows".. В режиме отладки я не могу остановиться в HookProc по break point'у (в Builder) и создается такое впечатление, что она находится в другой области памяти.. Непонятно только как.. В MSDN написано, что переменные нужно объявлять примерно так:
#pragma data_seg(".SHARDATA")
static int Count = 0;
#pragma data_seg()
только мне это опять же не помогло.. :)
Еще раз спасибо.. :)
Re[7]: Глобальные переменные в HOOKPROC
От:
Аноним
Дата:
26.09.01 13:23
Оценка:
Здравствуйте DenisII, вы писали:
DII>В MSDN написано, что переменные нужно объявлять примерно так:
DII>#pragma data_seg(".SHARDATA") DII>static int Count = 0;
Если вздумаешь еще добавить сюда переменые, _обязательно_ инициализируй их при
создании DII>#pragma data_seg()
И еще добавь вот такую вот строчку:
#pragma comment(linker, "/SECTION:.SHARDATA,RWS")
Это сделает данную секцию общей для всех процессов которые подгрузили твою хуковую DLL.
Здравствуйте DenisII, вы писали:
DII>Глобальные переменные в HOOKPROC равны нулю. DII>В любой другой процедуре все ОК. DII>Как быть?
Гы. Если у тебя глобальный хук в библиотеке, то секция данных (и глобальные переменные) создается в каждом процессе заново. :) Вывод — используй shared-секцию.
Впрочем, ты это уже и сам нашел. :) А вообще, на сайте лежит неплохая статья про глобальные хуки (в моем переводе :)).