Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo,

ich habe folgendes Programm:


meine Dll:

#define WINVER				0x501

#define _WIN32_WINNT		0x501


#include <windows.h>



HINSTANCE	g_hInstance;

HHOOK		g_hHook;



BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)

{

	switch(dwReason)

	{

	case DLL_PROCESS_ATTACH:

		g_hInstance = hInstance;

		break;

	case DLL_THREAD_ATTACH:

		g_hInstance = hInstance;

		break;

	case DLL_THREAD_DETACH:

		break;

	case DLL_PROCESS_DETACH:

		break;

	}

	return TRUE;

}



LRESULT HookProc(int nCode, WPARAM wParam, LPARAM lParam)

{

	return CallNextHookEx(g_hHook, nCode, wParam, lParam);

}



BOOL InstallHook()

{

	g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)HookProc, g_hInstance, 0);

	return g_hHook != NULL;

}


mein Programm:


#define WINVER				0x501

#define _WIN32_WINNT		0x501


#include <windows.h>



typedef BOOL (*InstallHook)();



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)

{

	HMODULE hDll = LoadLibrary("SysMnuExtDll.dll");


	InstallHook ProcAdd = (InstallHook)GetProcAddress(hDll, "InstallHook");


	ProcAdd();


	for (int i = 0; i < 30; i++)

		Sleep(1000);


	FreeLibrary(hDll);


	return 0;

}

Das Problem ist, dass meine Hook Funktion nicht aufgerufen wird. Weiß vielleicht jemand warum?

Geschrieben

Woran merkst du, dass die Hook-Funktion nicht aufgerufen wird?

Wenn du damit diese Funktion meinst:


LRESULT HookProc(int nCode, WPARAM wParam, LPARAM lParam)

{

 return CallNextHookEx(g_hHook, nCode, wParam, lParam);

}

dann würde ja eh nicht viel passieren da die Ereignisse (meinem Verständnis nach) nur an den nächsten Hook weitergereicht werden...

Geschrieben

Hi

Ich kann leider nicht direkt auf deine Frage antworten.

Lass mal in der DllMain des InstanceHandle in ne Datei protokolieren, weil

mich würds mal interessieren wie oft die DLL geladen wird. Bei nem Systemweiten

Hook in alle Prozessräume? Oder etwa sogar in den Speicherbereich des Systems?

Protokolier das mal mit, wenn mehrere Instanzen deiner DLL geladen werden kanns

sein das deine CallNextHookEx nicht funktioniert weil du dir dein HANDLE nur

in der aktuellen Instanz merkst, aber nicht in allen, da brauchst nen SharedMem

Bereich.

Und protokolier doch mal in ne Datei mit ob deine Hook-prozedur aufgerufen wird.

Wenn du versuchst mit dem Debugger da stehenzubleiben wirst du scheitern, aber

du kannst nen Interrupt 3 aufrufen, dann holt das System den Debugger

automatisch...

Hoffe das hilft dir ein wenig...

Gruß

Diablo999

Geschrieben

Ich hatte an diversen Stellen im Programm und in der Dll einen Aufruf der Funktion "OutputDebugString("Aufruf blablabla\n"); eingefügt, um zu merken, ob die Funktionen aufgerufen werden oder nicht. Dabei kam heraus, das die DllMain einmal, die Funktion InstallHook ebenfalls einmal und eben die HookProc keinmal aufgerufen wurde.

Geschrieben

Ein Aufruf von GetLastError nach dem Aufruf von SetWindowsHookEx gibt 6 zurück (ungültiger Handle).

Damit kann ja nur g_hInstance gemeint sein, oder???. Wie kann ich das Problem den umgehen? Hat jemand eine Lösung?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...