Проблема с хуками под Windows XP.
От: isniper  
Дата: 28.10.03 12:56
Оценка:
Мне нужно считывать через хук клавиатуру!
Я сделал следующее: создал библиотеку на основе Win32 static library:
.cpp:
#pragma data_seg(".shared")
HINSTANCE hInst = 0;
HHOOK hHook = 0;
HWND TargetWnd = 0;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,rws")

static LRESULT CALLBACK KeyboardProc(UINT nCode, WPARAM wParam, LPARAM lParam) {
if(nCode < 0) return CallNextHookEx(hHook2, nCode, wParam, lParam);
...
return CallNextHookEx(hHook2,nCode,wParam,lParam);
}
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {
hInst=(HINSTANCE)hModule;
return TRUE;
}
void InstallHook(HWND hWnd) {
TargetWnd = hWnd;
hHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInst,0);
}
void UninstallHook() {
UnhookWindowsHookEx(hHook);
}
.h файл:
void InstallHook(HWND hWnd);
void UninstallHook();

Подключил .lib и .h файлы к своей проге и в самой проге уже вызываю:
InstallHook(m_hWnd);
UninstallHook();
Проблема заключается в том, что под 98-й виндой все работает, а под ХР не хочет (функция SetWindowsHookEx возвращает NULL).
Заранее спасибо за помощь!
Re: Проблема с хуками под Windows XP.
От: Andrew S Россия http://alchemy-lab.com
Дата: 28.10.03 16:01
Оценка:
I>Проблема заключается в том, что под 98-й виндой все работает, а под ХР не хочет (функция SetWindowsHookEx возвращает NULL).
I>Заранее спасибо за помощь!

А что GetLastError говорит?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Проблема с хуками под Windows XP.
От: isniper  
Дата: 28.10.03 16:15
Оценка:
Здравствуйте, Andrew S, Вы писали:
AS>А что GetLastError говорит?

Говорит что все в порядке!
Re[3]: Проблема с хуками под Windows XP.
От: Alex Fedotov США  
Дата: 29.10.03 02:11
Оценка:
Здравствуйте, isniper, Вы писали:

I>Здравствуйте, Andrew S, Вы писали:

AS>>А что GetLastError говорит?

I>Говорит что все в порядке!


Не может быть. Встань в отладчике на вызов SetWindowsHookEx, посмотри, что в hInst передается.
-- Alex Fedotov
Re: Проблема с хуками под Windows XP.
От: Saruman Россия none
Дата: 29.10.03 05:17
Оценка: 1 (1)
Здравствуйте, isniper, Вы писали:

I>.cpp:

I> #pragma data_seg(".shared")
I> HINSTANCE hInst = 0; << здесь ошибка
I> HHOOK hHook = 0;
I> HWND TargetWnd = 0;
I> #pragma data_seg()
I> #pragma comment(linker, "/section:.shared,rws")

hInst для каждой копии хуковой длл-ны должен быть свой, а ты переменную в шаред-сегмент запихал.
Просто объяви её вне этого сегмента как обычную глобальную переменную...
Типа того что как бы...
Re[2]: Проблема с хуками под Windows XP.
От: Andrew S Россия http://alchemy-lab.com
Дата: 29.10.03 06:58
Оценка:
I>>.cpp:
I>> #pragma data_seg(".shared")
I>> HINSTANCE hInst = 0; << здесь ошибка
I>> HHOOK hHook = 0;
I>> HWND TargetWnd = 0;
I>> #pragma data_seg()
I>> #pragma comment(linker, "/section:.shared,rws")

S>hInst для каждой копии хуковой длл-ны должен быть свой, а ты переменную в шаред-сегмент запихал.

S>Просто объяви её вне этого сегмента как обычную глобальную переменную...

Но как в данном случае это влияет на SetWindowsHookEx? Тут явно что то еще..
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Проблема с хуками под Windows XP.
От: isniper  
Дата: 29.10.03 08:09
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Но как в данном случае это влияет на SetWindowsHookEx? Тут явно что то еще..


Проверил еще раз GetLastError — выдало следующее:
"Невозможно установить нелокальный обработчик без дескриптора модуля."
(хотя раньше как мне казалось писало что все нормально)
Кстати выдает эту ошибку и в случае если объявляю HINSTANCE hInst вне сегмента как обычную глобальную переменную!
Re[4]: Проблема с хуками под Windows XP.
От: Andrew S Россия http://alchemy-lab.com
Дата: 29.10.03 14:50
Оценка:
AS>>Но как в данном случае это влияет на SetWindowsHookEx? Тут явно что то еще..

I>Проверил еще раз GetLastError — выдало следующее:

I>"Невозможно установить нелокальный обработчик без дескриптора модуля."
I>(хотя раньше как мне казалось писало что все нормально)
I>Кстати выдает эту ошибку и в случае если объявляю HINSTANCE hInst вне сегмента как обычную глобальную переменную!

Гм, а что означает эта фраза?
I>Я сделал следующее: создал библиотеку на основе Win32 static library

Милейший, уж не сделали ли Вы просто статическую библиотеку вместо динамической? Если так, то на кой раз должна, собственно, вызываться dllmain и, уж тем более, хоть как-то инициализироваться hInst? Статическая библиотека это просто хранилище кода (и данных), но никак не отдельный PE модуль.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.