Hook w BCB nie działa pod debugerem

0

Witam wszystkich,
w VS2005 napisałem prostego dlla instalującego hooka.

TEST_API int InstallHook(void)
{
	hHooks = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC) GetMsgProc, (HINSTANCE) hInstance, 0);
	return (int)hHooks; 
}

TEST_API int UnInstallHook(void)
{
	return UnhookWindowsHookEx(hHooks);
}

LRESULT CALLBACK GetMsgProc (int code, WPARAM wParam, LPARAM lParam )
{
	if (code < 0) return CallNextHookEx(hHooks, code, wParam, lParam);
	MSG		*lpMsg;
	lpMsg = (MSG *) lParam;
//przetwarzanie wiadomosci
	return CallNextHookEx(hHooks, code, wParam, lParam);
}

Teraz w aplikacji napisanej w BCB6 ładuję dlla, instaluję hooka przy pomocy InstallHook. Problem w tym, że wyłapywane są wiadomości tylko okna tej aplikacji. Ostatni parametr w SetWindowsHookEx ustawiony na 0 powinien wymusić wyłapywanie wiadomości w całym systemie. Czemu tak się nie dzieje?
Na sieci znalazłem prosty przykład napisany w VB, kiedy użyłem w nim mojego dlla wyłapywane były wszystkie wiadomości. Przykład kompilowałem w Visual Studio.

0

hHooks = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC) GetMsgProc, (HINSTANCE) hInstance, 0);//tutaj

a hInstance to na pewno uchwyt do załadowanej biblioteki? może przez pomyłkę dałeś uchwyt z WinMain

0
crayze napisał(a)

hHooks = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC) GetMsgProc, (HINSTANCE) hInstance, 0);//tutaj

a hInstance to na pewno uchwyt do załadowanej biblioteki? może przez pomyłkę dałeś uchwyt z WinMain

na pewno:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	hInstance = hModule;

	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}
0
lechoo napisał(a)
crayze napisał(a)

hHooks = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC) GetMsgProc, (HINSTANCE) hInstance, 0);//tutaj

a hInstance to na pewno uchwyt do załadowanej biblioteki? może przez pomyłkę dałeś uchwyt z WinMain

na pewno:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	hInstance = hModule;

	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}

Ale tu pokazujesz kod DLLki, chodzi mi o to czy w programie podajesz właściwy uchwyt, zwrócony funkcją LoadLibrary()

0

Sprawdziłem, podaje właściwy.

Już wiem czemu hook nie działał prawidłowo. Jego działanie sprawdzałem pod debuggerem stawiając breakpoint w GetMsgProc. Testowo dodałem tam kilka linijek kodu które po prostu zapisują wiadomości do pliku i odpaliłem bez debuggera. Działa prawidłowo.

//to zmieniłem temat, łatwiej może ktoś kiedyś znajdzie, jak będzie miał problem z hookami w BCB - R

1 użytkowników online, w tym zalogowanych: 0, gości: 1