Проблема с хуками
Участников: 2
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Проблема с хуками
Не знаю что за хрень, но при завершении программы, она висит в диспетчере, с последующим вылетом проводника.
Вот мой файл DLL:
Это файл основной программы:
Блин на MASM такой же код без всякого патчинга работает как надо...
Вот мой файл 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
Блин на MASM такой же код без всякого патчинга работает как надо...
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Проблема с хуками
привет.
убери "cdecl", и тогда все будет ок.
дома проверю, но думаю, что callback функция должна быть stdcall, это же winapi.
убери "cdecl", и тогда все будет ок.
дома проверю, но думаю, что callback функция должна быть stdcall, это же winapi.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Проблема с хуками
Изначально пример был с stdcall конвенцией вызова. Это я уже потом в попытках от безысходности начал тупо пробовать и так и сяк...electrik пишет:привет.
убери "cdecl", и тогда все будет ок.
дома проверю, но думаю, что callback функция должна быть stdcall, это же winapi.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Проблема с хуками
та же фигня. причем, вроде через раз, ну или как-то так. после вылета проводника, захожу в диспетчер задач, а он там висит
попробуй, 24 tutorial iczelion'а. я его на семерке не проверял. ща влом компилить, спать хочу.
попробуй, 24 tutorial iczelion'а. я его на семерке не проверял. ща влом компилить, спать хочу.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Проблема с хуками
Попробовал , тоже самое.electrik пишет:та же фигня. причем, вроде через раз, ну или как-то так. после вылета проводника, захожу в диспетчер задач, а он там висит
попробуй, 24 tutorial iczelion'а. я его на семерке не проверял. ща влом компилить, спать хочу.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Проблема с хуками
гм... значит надо по форумам полазить, может быть, что есть более новые функции для работы с хуками.
хотя, если ты говоришь что на асме оно не глючит, может все дело в начальных инициализациях во FreeBasic.
там же перед нашим кодом, идет инициализация коммандной строки, и еще всякая хрень.
надо попробовать скомпилить без fb и gcc библиотек.
хотя, если ты говоришь что на асме оно не глючит, может все дело в начальных инициализациях во FreeBasic.
там же перед нашим кодом, идет инициализация коммандной строки, и еще всякая хрень.
надо попробовать скомпилить без fb и gcc библиотек.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Проблема с хуками
скомпилил без fb и gcc библиотек. вроде, работает как надо - без вылетов проводника.
код dllhook.bas
интересно, если этот код на mingw переписать, будет ли там работать. эта проблема 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
- Код:
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
интересно, если этот код на mingw переписать, будет ли там работать. эта проблема fb библиотек или gcc.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Проблема с хуками
Да, так работает хорошо. Спасибо!
Попробовал переписать на СИ, но не получилось. Функция setwindowhookex возвращает 0. Возможно не так написал или есть какие-то хитрости в компиляции... В общем не вышло и хрен с ним, главное на FB все разрулилось. Если интересно, вот код, посмотри что не так:
Попробовал переписать на СИ, но не получилось. Функция 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
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|