Форум — Ответы     (  К темам )
 ?  quaSAR: Беда! SetWindowsHookEx (21-02-2003 07:37:33)
Делаю перехватчик клавиатуры. Все вроде работает, НО!!!
/mainunit.cpp\
#include "globals.h"
....

hhk = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc,
(HINSTANCE)GetCurrentProcessId(), 0);
....
MSG msg;
while (GetMessage(&msg,0,0,0))
{
if (isdestroyed) //isdestroyed == true когда приложение закрывается
{
UnhookWindowsHookEx(hhk);
};
TranslateMessage(&msg);
DispatchMessage (&msg);
};
....


/functions.cpp\
#include "globals.h"
HHOOK hhk;
BOOL isdestroyed;
....

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
Beep(0,0);
// memcpy (SBuffer, (void *)wParam, 1); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return 0;
}
else return CallNextHookEx ((HHOOK)hhk, code, wParam, lParam);
};

/globals.h\
#ifndef HGLOBALSFILE
#define HGLOBALSFILE
#include <windows.h>

extern void * SBuffer;
extern HHOOK hhk;
extern BOOL isdestroyed;

extern LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

Суть проблемы в том, что когда выполняется строка , помеченная !!!!!!!!!!!!!!!!,
возникает ошибка типа AccessViolation по адресу FFFFFFFF....
Вот если оставить только функцию Beep(..) то она прекрасно выполняется.
Чувствую что вопрос ламера!
Что мне делать, господа профи ??
 Павел (21-02-2003 20:34:46)
Я не профи, просто
1/ вызывает сомнение необходимость использования memcpy()
2/ возможно вы, объявив указатель void * SBuffer
не выделили для него под wParam необходимую память.
(хоть и всего слово) — во всяком случае в том коде, что вы привели,
выделения памяти под SBuffer нет и копирование wParam происходит
куда-то непонятно куда отсюда и возникает ошибка
типа AccessViolation по адресу FFFFFFFF....
 Георгий (22-02-2003 12:01:48)
Я не профи., просто
1. FFFFFFFF == -1 т.е. в wParam у тебя -1
А Mircosoft отрицательные коды истользует для обозначения особых ситуаций...
2. может действительно память под SBuffer не выделил ? или выделил но не так как надо — попробуй через GlobalAlloc
3. я в хуках плохо разбираюсь, но у тебя в адресное пространство другой задачи входит только функция хук? если это так, то через память данные передавать не получится — разные задачи у них свои адресные пространства, причём линейные адреса могут совпадать и передачу данных надо делать через механизмы межпроцесной связи — начиная с Windows Message (SendMessage и т.п.) и закинчивая DDE,OLE,COM...