Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-67419
blast
2003-02-28 15:01
2003.04.21
Как ПРОГРАММНО расшарить диски под WinNT??


4-67613
_toltec
2003-02-17 14:48
2003.04.21
Функция из чужого процесса


1-67266
Crush_FM
2003-04-11 13:44
2003.04.21
Компоненты


14-67447
Steven
2003-04-02 14:02
2003.04.21
Кто-нибудь видел компоненты с Win CE?


14-67437
kostya2000
2003-04-04 19:33
2003.04.21
Люди, что вы можете сказать о фирме SIS?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский