Pipetten Programm (hook)
-
Hey,
ich habe eben ein Tutorial gelsen das über Hooks handelt und habe auch dort einen Code abegeschrieben um ihn zu testen. Habe den Code erst mal 1:1 übernommen um zu schauen wie das alles so Funktioniert nur findet mein Hauptprogramm in der von mir erstellten .dll die Funktion InstallHook nicht.
Hat Jemand eine Lösung für mein Problem?
http://www.tutorials.de/forum/c-c-tutorials/164662-tutorial-ueber-windows-hooks.htmlHauptprogramm (gekürzt^^) :
//main.h #include <windows.h> #include <stdio.h> /* Defines */ ... typedef bool (CALLBACK *MYFUNC)(void); /* Prototypen */ ... /* Globale Variablen */ MYFUNC InstallHook; MYFUNC UninstallHook; ...//main.cpp #include "main.h" int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { ... HINSTANCE hDLL = LoadLibrary("mousehook.dll"); if (hDLL == NULL) { MessageBox(NULL, "Fehler beim Laden der DLL: mousehook.dll", "Fehler", MB_OK); return FALSE; } InstallHook = (MYFUNC) GetProcAddress(hDLL, "InstallHook"); if(InstallHook == NULL) { MessageBox(NULL, "Fehler: InstallHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK); return FALSE; } ... FreeLibrary(hDLL); ... }mousehook.dll:
#ifndef _DLL_H_ #define _DLL_H_ #include <windows.h> #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */ #define SHARED __attribute__((section(".shr"), shared)) DLLIMPORT BOOL InstallHook(); DLLIMPORT BOOL UninstallHook(); LRESULT CALLBACK MouseProc(int nCode, WPARAM wParma, LPARAM lParma); #endif /* _DLL_H_ *//* Replace "dll.h" with the name of your header */ #include "dll.h" HHOOK g_hMouseHook SHARED = NULL; HINSTANCE g_hInst SHARED = NULL; BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { g_hInst = hInst ; return TRUE; } DLLIMPORT BOOL InstallHook() { if(g_hMouseHook != NULL) return TRUE; g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0); if(g_hMouseHook == NULL) return FALSE; return TRUE; } ...
-
Vermutlich benutzt Dunicht die selbe Enticklungs Umgebung wie das Tutorial.
Schau Dir mit Depends an, wasdie DLL exportiert. Du wirst sehen, dass Die Funktion eben nicht InstallHook sondern _InstallHook heißt.Verwende eine DEF Datei oder lerne wie __declspec(dllexport) funktioniert.
-
Danke erstmal für die Antwort und vorallem dem Tipp mit Depends.
Ich habe mir ma angeschaut was die DLL exportiert und bin ziemlich überrascht :X. Mit _Z11InstallHookv funktioniert es (benutze die selbe IDE wie im Tut).
Hat das noch mehr Auswirkung auf meine DLL als nur der Funktionsname? Das Programm läuft nämlich leider nicht :P.
-
Dein Name ist gemangelt. Du hast kein C Programm geschrieben sondern ein C++!
Du müsstest extern "C" verwenden!
-
wie martin richter bereits gesagt hat, musst du den funktionen ein extern "C" vorstellen:
extern "C" DLLIMPORT void myfunc(); //oder extern "C" { // decl DLLIMPORT void myfunc(); // ... }du kannst das auch in das makro einbauen

durch das extern "C" wird die funktion aber wie eine C-funktion behandelt,
d.h.sie darf nicht in einem namespace stehen
keine klassen als parameter oder returntyp (als ref geht glaube ich)
keine templates (kann man eh nich eexportieren.ansonsten hat es nur auswirkungen auf den exportierten namen.
der compiler darf die funktion nennen wie er will, wenn du kein extern "C"
verwendest. meist codiert er darin den namespace, die klasse, parameter, etc.wenn es nicht läuft, liegt es an was anderem. wäre gut wenn du uns sagst,
wass "läuft nicht" konkret bedeutet.