FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Проблема с хуками

Участников: 2

Перейти вниз

Проблема с хуками Empty Проблема с хуками

Сообщение  trew Вс Сен 15, 2013 9:50 am

Не знаю что за хрень, но при завершении программы, она висит в диспетчере, с последующим вылетом проводника.

Вот мой файл DLL:

Код:
#Include "windows.bi"


Dim Shared As HINSTANCE hinst
Dim Shared As HWND Hwnd
Dim Shared As HHOOK hhMousehook

hinst = GetModuleHandle("dllhook.dll")

Function MouseProc Cdecl alias "MouseProc"(nCode As Integer,wparam As WPARAM, lparam As LPARAM) As Integer

 Dim mhs As MOUSEHOOKSTRUCT Ptr = Cast(MOUSEHOOKSTRUCT Ptr,lparam)

 Function = CallNextHookEx(hhMousehook , nCode , wParam , lParam)

 If nCode = HC_ACTION  Then
 PostMessage(Hwnd,WM_NULL,mhs->pt.x ,mhs->pt.y)
 EndIf

End Function
extern "windows-ms"
Function SetHook Alias "SetHook"(Hw As HWND) As BOOL Export
 Hwnd = Hw
 hhMousehook = SetWindowsHookEx(WH_MOUSE , Cast(Any Ptr,@MouseProc),hinst,0)
 If hhMousehook Then Return TRUE
End Function

Function UnSetHook Alias "UnSetHook"() As BOOL export
 Return UnhookWindowsHookEx(hhMousehook)
End Function
end Extern


Это файл основной программы:

Код:
#Include "windows.bi"
extern "windows-ms"
Declare Function SetHook Lib "dllhook.dll"   Alias "SetHook"(Hwnd As HWND) As BOOL
Declare Function  UnSetHook Lib "dllhook.dll"    Alias "UnSetHook"() As BOOL
end Extern

Function newProc(hwnd As HWND, msg As UINT, wparam As WPARAM, lparam As LPARAM) As Integer
 If msg = WM_NULL Then
 Dim As String sVal = wparam & "x" & lparam
 SetWindowText(hwnd,sVal)
 ElseIf msg = WM_DESTROY Then
 UnSetHook()
 PostQuitMessage(0)
 EndIf
 Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

Dim msg As MSG
Dim As HWND hwnd
hwnd = CreateWindowEx(0,"#32770","",WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,0,0)
SetWindowLong(hwnd,GWL_WNDPROC,@newProc)
? SetHook(hwnd)
While GetMessage(@msg,0,0,0)
 TranslateMessage(@msg)
 DispatchMessage(@msg)
Wend
DLL патчу с помощью StudPe секцию bss для глобальной обработки хука. Все вроде работает, но в конце бяка с вылетом. Может это только у меня из-за какого-то другого софта. Если не сложно потестируйте, кому не сложно. Я тестировал на Win7.

Блин на MASM такой же код без всякого патчинга работает как надо...

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  electrik Чт Сен 26, 2013 5:15 pm

привет.
убери "cdecl", и тогда все будет ок.
дома проверю, но думаю, что callback функция должна быть stdcall, это же winapi.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  trew Чт Сен 26, 2013 7:40 pm

electrik пишет:привет.
убери "cdecl", и тогда все будет ок.
дома проверю, но думаю, что callback функция должна быть stdcall, это же winapi.
Изначально пример был с stdcall конвенцией вызова. Это я уже потом в попытках от безысходности начал тупо пробовать и так и сяк...

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  electrik Пт Сен 27, 2013 1:25 am

та же фигня. причем, вроде через раз, ну или как-то так. после вылета проводника, захожу в диспетчер задач, а он там висит
попробуй, 24 tutorial iczelion'а. я его на семерке не проверял. ща влом компилить, спать хочу.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  trew Пт Сен 27, 2013 5:55 pm

electrik пишет:та же фигня. причем, вроде через раз, ну или как-то так. после вылета проводника, захожу в диспетчер задач, а он там висит
попробуй, 24 tutorial iczelion'а. я его на семерке не проверял. ща влом компилить, спать хочу.
Попробовал , тоже самое.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  electrik Сб Сен 28, 2013 5:01 pm

гм... значит надо по форумам полазить, может быть, что есть более новые функции для работы с хуками.
хотя, если ты говоришь что на асме оно не глючит, может все дело в начальных инициализациях во FreeBasic.
там же перед нашим кодом, идет инициализация коммандной строки, и еще всякая хрень.
надо попробовать скомпилить без fb и gcc библиотек.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  electrik Сб Сен 28, 2013 5:38 pm

скомпилил без fb и gcc библиотек. вроде, работает как надо - без вылетов проводника.
код dllhook.bas
Код:

#Include "windows.bi"


Dim Shared As HINSTANCE hinst
Dim Shared As HWND Hwnd
Dim Shared As HHOOK hhMousehook
function DllMain  alias "DllMain" _
(byval hinstDLL as HINSTANCE, _ ' дескриптор модуля DLL
byval fdwReason as DWORD, _    ' причина вызова функции
lpvReserved as LPVOID) as BOOL 'зарезервированный

hinst = hinstDLL
return TRUE
end function

Function MouseProc Cdecl alias "MouseProc"(nCode As Integer,wparam As WPARAM, lparam As LPARAM) As Integer

 Dim mhs As MOUSEHOOKSTRUCT Ptr = Cast(MOUSEHOOKSTRUCT Ptr,lparam)

 Function = CallNextHookEx(hhMousehook , nCode , wParam , lParam)

 If nCode = HC_ACTION  Then
 PostMessage(Hwnd,WM_NULL,mhs->pt.x ,mhs->pt.y)
 EndIf

End Function
extern "windows-ms"
Function SetHook Alias "SetHook"(Hw As HWND) As BOOL Export
 Hwnd = Hw
 hhMousehook = SetWindowsHookEx(WH_MOUSE , Cast(Any Ptr,@MouseProc),hinst,0)
 If hhMousehook Then Return TRUE
End Function

Function UnSetHook Alias "UnSetHook"() As BOOL export
 Return UnhookWindowsHookEx(hhMousehook)
End Function
end Extern
файл dllhook.bat
Код:

fbc dllhook.bas -r
D:\FreeBASIC\bin\win32\as.exe --32 --strip-local-absolute "dllhook.asm" -o "dllhook.o"
D:\FreeBASIC\bin\win32\ld.exe -o "dllhook.dll" -subsystem console --dll --enable-stdcall-fixup -e _DllMain@12 --stack 1048576,1048576 --output-def "dllhook.def" -s -L "D:\FreeBASIC\lib\win32" -L "." "dllhook.o" "-(" -lkernel32 -lgdi32 -luser32 -lversion -ladvapi32 -lmsvcrt "-)"
D:\FreeBASIC\bin\win32\dlltool.exe --def "dllhook.def" --dllname "dllhook.dll" --output-lib "libdllhook.dll.a"
pause
что-то не так, в инициализациях fb перед нашим кодом. вообще, если шариш в инглише, напиши им про эту проблему. ведь это глюк, и причину его надо найти и устранить. это мы продвинутые и можем рулить командной строкой. а ведь новички столкнутся с проблемой, и долго будут репу чесать.
интересно, если этот код на mingw переписать, будет ли там работать. эта проблема fb библиотек или gcc.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Вернуться к началу Перейти вниз

Проблема с хуками Empty Re: Проблема с хуками

Сообщение  trew Сб Сен 28, 2013 7:59 pm

Да, так работает хорошо. Спасибо!

Попробовал переписать на СИ, но не получилось. Функция setwindowhookex возвращает 0. Возможно не так написал или есть какие-то хитрости в компиляции... В общем не вышло и хрен с ним, главное на FB все разрулилось. Если интересно, вот код, посмотри что не так:

Код:
#include "main.h"

HINSTANCE hinst;
HWND Hwnd;
HHOOK hhMousehook;


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    hinst = hinstDLL;
    return TRUE; // succesful
}


LRESULT CALLBACK MouseProc (int nCode,WPARAM wparam , LPARAM lparam){

    LRESULT result;

   MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lparam;

   result = CallNextHookEx(hhMousehook , nCode , wparam , lparam);

   if (nCode == HC_ACTION) {

   PostMessage(Hwnd,WM_NULL,mhs->pt.x ,mhs->pt.y);
   }

return result;
}




HHOOK DLL_EXPORT SetHook (HWND Hw){

   Hwnd = Hw;
   HHOOK result;
   result = SetWindowsHookEx(WH_MOUSE , (HOOKPROC) MouseProc,hinst,0);

   hhMousehook = result;
   return result;

}


BOOL DLL_EXPORT UnSetHook() {
  BOOL result;
result = UnhookWindowsHookEx(hhMousehook);
return result;
}

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения