Пытаюсь получить адрес WndProc другого приложения, и на invoke SetWindowLong,hSub,GWL_WNDPROC,ADDR HookProc возвращается ноль, на вызов GetLastError: описание ошибки - "Отказано в доступе" A SPY++ показывает адрес WndProc, без проблем. Как можно получить доступ к этой процедуре, чтобы самому обработать одно из сообщений, которое в ней не обрабатывается? Заранее спасибо
vinnie_pooh Я вот ставлю его (хук), а он падает, иногда вместе с Виндой на пару Сначала процедура обработки HookProc была в ехе, затем перенёс в dll, но что-то танцы с бубном не помогают ( Где тут может быть засада? Код (Text): ;тут получение адресов 2-х процедур из dll ;адреса получаю корректно .elseif eax==WM_CREATE invoke LoadLibrary,ADDR LibName .if eax!=0 mov hLib,eax invoke GetProcAddress,hLib,ADDR ProcName1 mov hProc1,eax invoke GetProcAddress,hLib,ADDR ProcName2 mov hProc2,eax .endif ;тут ставлю хук на сообщения invoke GetWindowRect,hWin,ADDR Rct dec Rct.left invoke WindowFromPoint,Rct.left,Rct.top mov hSub,eax ; установка хука на сообщения, hProc2 - адрес процедуры обработки в dll. invoke SetWindowsHookEx,WH_GETMESSAGE,hProc2,hInstance,0 mov hScrHook,eax push hScrHook ;хэндл хука push WM_MOUSEWHEEL ;интересующее сообщение push hSub ;хэндл окна, для которого сообщение Call hProc1 ;процедура установки 3-х значений^^ ;а здесь две процедуры в dll: первая - её адрес в ехе hProc1 SetHookData proc hWin:DWORD, HookMessage:DWORD, hHook:DWORD .data HookWnd dd ? HookMsg dd ? hScrHook dd ? .code push hHook pop hScrHook push hWin pop HookWnd push HookMessage pop HookMsg PrintHex HookWnd ;хендл хука, хэндл окна и код интересующего сообщения приходят нормально PrintDec HookMsg PrintDec hScrHook ret SetHookData endp ;вторая процедура - её адрес в ехе - hProc2 HookProc proc hCode:DWORD, wParam:DWORD, lParam:DWORD invoke Beep,1000,100 ;это как индикатор :) mov eax,hCode .if eax<0 invoke CallNextHookEx,hScrHook,hCode,wParam,lParam ret .else mov eax,lParam cmp eax,HookMsg jne @F ret @@: invoke CallNextHookEx,hScrHook,hCode,wParam,lParam ret .endif xor eax,eax ret HookProc endp и ни хрена не бикает вторая процедура. Не вызывается вообще Пробовал WH_CALLWNDPROCRET поставить - Винда падает... masquer А может у тебя какой пример найдётся, а то поиск мне только предложил внедриться в процесс производства каких-то макарон (через ya.ru)
Помоему ICEZLION предупреждал что хук должен находиться в библиотеке.. которая должна меппироваться в процесс нужный (ID процесса указываешь про установке хука) Так что читай внимательно !
Почитал IsZelion: в нём указано, что секция неинициализированных данных должна быть разделяемая между процессами, якобы это реализуется через опции линкера /SECTION:.bss,S Пытаюсь указать эту опцию в RadASM'e - он все что после .bss воспринимает как имя файла и на такую строку 7,O,$B\LINK.EXE /SECTION:.bss,S /SUBSYSTEM:WINDOWS /RELEASE /DLL /DEF:$6 /LIBPATH:"$L" /OUT:"$7",3 выдаёт ошибку, что не найден файл S /SUBSYSTEM:WINDOWS /RELEASE /DLL /DEF:$6 /LIBPATH:"$L" /OUT:"$7",3 А как указать RadASM'у, что секция разделяемая (S) - не знаю. Пробовал использовать makefile из туториала (из примера) - он тоже не работает. DLL не создаётся. Такой вот капкан (( А сама dll работает, но выдаёт сообщения только адресуемые моему окну, а мне они нахрен не нужны, нужны чужие.
Радасм не слинкует ее вот я создал *.BAT файлик все отлично линкуеться ... сам проверял (причем недавно)... @echo off E:\ASM\masm32\bin\ml /c /coff /Cp Splash_dll.asm E:\ASM\masm32\bin\Link /SECTION:.bss,S /DLL /DEF:Splash_dll.def /SUBSYSTEM:WINDOWS /LIBPATH:E:\ASM\masm32\lib Splash_dll.obj pause и еще в своем исходнике пропиши пути к инклюдам иначе нихера не закомпилиться
TermoSINteZ Да, я тут шёл сказать, что пришлось все пути к инклюдам указать полностью, а не относительные. Как и в .bat'e Усё работает Спасибо всем