Форум: "WinAPI";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c