Глобальные переменные в HOOKPROC
От: DenisII  
Дата: 26.09.01 08:02
Оценка:
Глобальные переменные в HOOKPROC равны нулю.
В любой другой процедуре все ОК.
Как быть?
Re: Глобальные переменные в HOOKPROC
От: Alex  
Дата: 26.09.01 09:12
Оценка:
Здравствуйте DenisII, вы писали:

DII>Глобальные переменные в HOOKPROC равны нулю.

DII>В любой другой процедуре все ОК.
DII>Как быть?

Не плохо было бы посмотреть код. Пришли в голову две причины появления этих глюков:

1.
Если HOOKPROC и остальные функции находятся в разных юнитах, то надо описать переменные при помощи extern. Тогда переменные будут видны из всех юнитов одинаково.

2.
Может быть инициализируются переменные после установки HOOK, тогда тоже можно понять.
Re[2]: Глобальные переменные в HOOKPROC
От: DenisII  
Дата: 26.09.01 09:22
Оценка:
Здравствуйте Alex, вы писали:

A>1.

A>Если HOOKPROC и остальные функции находятся в разных юнитах, то надо описать переменные при помощи extern. Тогда переменные будут видны из всех юнитов одинаково.

Как раз моя HookProc и переменные, которые мне нужны в ней, объявлены в одном юните. Инициализирую переменные сразу после подключения h-файлов. Потом, в процессе работы программы, значения этих переменных изменяются.

A>2.

A>Может быть инициализируются переменные после установки HOOK, тогда тоже можно понять.

Объявляю я их до вызова процедуры SetHook();
Re[3]: Глобальные переменные в HOOKPROC
От: Alex  
Дата: 26.09.01 09:26
Оценка:
Здравствуйте DenisII, вы писали:

Хотелось бы код посмотреть:))
Re[4]: Глобальные переменные в HOOKPROC
От: DenisII  
Дата: 26.09.01 09:45
Оценка:
Здравствуйте 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
}
Re[5]: Глобальные переменные в HOOKPROC
От: Alex  
Дата: 26.09.01 10:22
Оценка:
Здравствуйте DenisII, вы писали:

Попробуйте сделать так:

static int Count = 0;

Если не поможет, то можно попробовать ставить HOOK не из функции OpenFile, а вот так (работоспособный пример):

static int Count=0;
static HHOOK hHook;
static LRESULT CALLBACK HookProc(int code, WORD wParam, long lParam);

static THookControlStruct
{
__fastcall THookControlStruct(){hHook=SetWindowsHookEx(WH_KEYBOARD, HookProc, 0, GetCurrentThreadId())};
__fastcall ~THookControlStruct(UnhookWindowsHookEx(hHook););
} HookControlStruct;

int OpenFile(...)
{
Count = 5;
}

static LRESULT CALLBACK HookProc(int code, WORD wParam, long lParam)
{
if (code<0 || code==HC_NOREMOVE) CallNextHookEx(hHook, code, wParam, lParam);
if ((lParam & 0x40000000) || !Count)
return CallNextHookEx(hAREKbrdHook, code, wParam, lParam);

....

return CallNextHookEx(hAREKbrdHook, code, wParam, lParam);
}
Re[6]: Глобальные переменные в HOOKPROC
От: DenisII  
Дата: 26.09.01 10:49
Оценка:
Здравствуйте Alex, вы писали:


A>static int Count = 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.
Re: Глобальные переменные в HOOKPROC
От: Lexey Россия  
Дата: 27.09.01 09:56
Оценка:
Здравствуйте DenisII, вы писали:

DII>Глобальные переменные в HOOKPROC равны нулю.

DII>В любой другой процедуре все ОК.
DII>Как быть?

Гы. Если у тебя глобальный хук в библиотеке, то секция данных (и глобальные переменные) создается в каждом процессе заново. :) Вывод — используй shared-секцию.

Впрочем, ты это уже и сам нашел. :) А вообще, на сайте лежит неплохая статья про глобальные хуки (в моем переводе :)).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.