Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

SetWindowsHookEx(WH_MOUSE,@MouseHook,HInstance,0)   Найти похожие ветки 

 
Eug201 ©   (2003-02-11 08:48) [0]

Подскажите, please. Есть проблема. Пишу программу для отлавливания сообщений мыши. Hook находится в DLL. Значение возвращаемое SetWindowsHookEx Передает другим копиям DLL через CreateFileMapping. Все работает, но: примерно через минуту установки хука проводник, или другое приложение грохаются с сообщением: инструкция по адресу 0xff64027d обратилась к памяти по адресу 0xff64027d. Память не может быть "read". Runtime error 216 at FF6400F8. В чем может быть фичка?

Куски кода:

type
PGlobalData=^TGlobalData;
TGlobalData=packed record
MouseHookHandle:HHOOK;
MouseHookInstalled:boolean;
MainPrgHandle:THandle;
MyMsgID:UINT;
end;
type
MParam=packed record
ParamLo:word;
ParamHi:word;
end;

...

// MOUSE_HOOK

function MouseHook(nCode:integer;wParam:MParam;lParam:MParam):longint; stdcall;
type MouseHookStruc=^MOUSEHOOKSTRUCT;
var
SlParam:MParam;
begin
if nCode>=0 then
begin
SlParam.ParamLo:=MouseHookStruc(lParam)^.pt.X;
SlParam.ParamHi:=MouseHookStruc(lParam)^.pt.Y;
PostMessage(GlobalData^.MainPrgHandle,GlobalData^.MyMsgID,LongInt(wParam),LongInt(SlParam));
end;
Result:=CallNextHookEx(GlobalData^.MouseHookHandle,nCode,LongInt(wParam),LongInt(lParam));
end;

//OPEN_GLOABAL_DATA
procedure OpenGlobalData;
begin
MFH:=CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE or SEC_COMMIT,0,SizeOf(TGlobalData),MY_SHAREDMEM_SID);
MF_Exists:=GetLastError=ERROR_ALREADY_EXISTS;
if MFH=0 then MessageBox(0,"Can""t create FileMapping",nil,0)
else
begin
GlobalData:=MapViewOfFile(MFH,FILE_MAP_WRITE,0,0,SizeOf(TGlobalData));
if GlobalData=nil then MessageBox(0,"Can""t make MapViewOfFile",nil,0)
else
if not MF_Exists then GlobalData^.MouseHookInstalled:=false;
end;
end;


// DLL_ENTRY_POINT
procedure DllEntryPoint(dwReason:DWord);stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;

....

exports
SetMouseHook,
UnhookMouseHook;

begin
DllProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end.


 
Eug201 ©   (2003-02-11 13:26) [1]

Please, help anybody...помираю...

Переделал программку. В основном exe делаю CreateFileMapping. При загрузки DLL делаю OpenFileMapping, копирую все в локальную переменную и закрываю хандл (открываю даже по чтению). Однако подлый Explorer вылетает :((( Значит проблема в обработке ловушки?

..

Пока писал, обнаружил некоторую закономерность. Если я тыкую по ярлыку и запускается программа, а мышка в это время находится там, где появилось окно программы - вылет. А если же мышка на моент запуска программы находилась в стороне - все ок. Я так понимаю когда я навожу мышку на окно, windows выполняет loadlibrary(myhookdll) от именя окна, грузя dll к процессу. Но почему вылетает?

p.s. в MouseHook оставлял только CallNextHook - не помогает :(


 
Eug201 ©   (2003-02-11 15:40) [2]

Ага. Проблема вот в этом месте:

begin
DllProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end.

Протрассировав dwReason в DllEntryPoint стало видно, что приходит что-то не то :(((

WinNT/2000/XP..etc работает похоже так (msdn.microsoft.com):

BOOL WINAPI DllMain(
HANDLE hinstDLL,
DWORD dwReason,
LPVOID lpvReserved
);

Выкинул переназначение DllProc на DllEntryPoint - и все поехало. Т.е. дело было в неккоректной загрузке DLL. Может кто подскажет, как начиная с бегин реагировать на dwReason? А то при выходе тоже выполняется ненужный код.


 
Eug201 ©   (2003-02-13 17:28) [3]

http://17slon.com/gp/gp/gpsyshook.htm
+ выполни поиск в форуме по hook, сейчас как-раз идет активное вопрошание насчет хууков, только ответов мало :))


 
SGh ©   (2003-02-20 11:37) [4]

Статья "Hooks аспекты реализации" поищи на www.infocity.kiev.ua
там думаю найдешь, ато я не помню где точно...

А кажись даже на этой страничке где-то была...



Страницы: 1 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
14-67471
Cranium
2003-04-01 17:26
2003.04.21
Помогите с алгоритмом...


7-67601
KPY
2003-02-27 15:49
2003.04.21
Как спрятать меню пуск с экрана?


3-67086
Будущий мастер
2003-04-01 19:13
2003.04.21
Проблемы с установкой Oracle 8 в Windows XP


9-67064
Axis_of_Evil
2002-11-18 13:13
2003.04.21
Вопросы


3-67117
opoloXAI
2003-04-02 17:47
2003.04.21
DBGrid Selected