Problem mit dll
-
ich hab versucht diesen code zu übernehmen, aber es scheitert schon beim laden irgendeiner funktion.
ich hab da in die dll eine testfunktion eingefügt:// dll.h #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT int test(int , int);
// cpp datei #include "stdafx.h" #include "dll.h" #include <string> using namespace std; #pragma data_seg("Shared") HWND hWindow=0; #pragma data_seg() #pragma comment (linker, "/section:Shared,RWS") int test(int a, int b) { return a+b; }
die dll wird wohl geladen, aber die funktion nicht.
typedef int (*TestFunc)(int, int ); TestFunc _TestFunc; _TestFunc=(TestFunc)GetProcAddress(hInstLibrary, "test");//Access violation
da kommt dann eine access violation in der letzten zeile, keine ahnung wieso.
hab schon eine andere dll getestet, da konnte die funktion geladen und benutzt werden.
hat jemand eine idee?
-
Woher weißt du, dass die DLL korrekt geladen wurde? Zeig mal deinen LoadLibrary-Aufruf. Prüfst du da die Rückgabe?
-
if(hInstLibrary) { cout<<"Dll geladen."<<endl; }
die testfunktion hab ich jetzt jedenfalls laden können, lag vermutlich an irgendwelchen problemen mit dem dateipfad.
jedenfalls schaff ich es trotzdem nicht die anderen funktionen
EXPORT BOOL CALLBACK SetupHook (HWND) und
EXPORT BOOL CALLBACK UninstallHook (void) zu laden.typedef BOOL (CALLBACK *SetupHook)(HWND hParent); SetupHook _SetupHook; _SetupHook=(SetupHook)GetProcAddress(hInstLibrary, "SetupHook");
geht nicht, ich weis aber auch nicht genau wie und wo ich das mit dem callback schreiben muss und wo das pointer zeichen hin soll.
-
Was heißt "geht nicht"? Es kommt aber nun keine Access Violation mehr, oder? Was genau ist der Fehler? Hast du nach dem Aufruf mal GetLastError ausgeführt?
-
keine access violation, aber ein ERROR_PROC_NOT_FOUND fehlercode.
-
Hm, schau mal mit dem Dependency Walker in die DLL. Wie sieht die Funktion da aus?
EDIT: Der Dependency Walker (depends.exe) ist ein Tool, dass du einfach bei Microsoft runterladen kannst.
-
also ich hab keine ahnung wie ich dependency walker benutzen soll. ich hab die .exe geladen, dann werden da die ganzen dlls angezeigt, und was soll ich dann machen?
jedenfalls hab ich versucht aus der dll die ich erstelle bei den funktionen das CALLBACK rauszunehmen, ich kann sowieso kaum nachvollziehen was das macht.
danach werden die funktionen zumindest alle geladen._SetupHook erwartet ein HWND als parameter, da wusste ich nicht genau was ich angeben soll, ich habs mit NULL versucht oder eben das handle von notepad.
in beiden fällen hängt sich jedes programm auf, welches im fokus ist und wo ich eine taste drücke.
hier der code:HWND testHandle=FindWindow("Notepad",NULL); cout<<testHandle<<endl; cout<<"Funktion geladen."<<endl; cout<<"Führe _SetupHook aus..."<<endl; cout<<_SetupHook(testHandle)<<endl; system("PAUSE"); cout<<"Führe _UninstallHook aus..."<<endl; cout<<_UninstallHook()<<endl; cout<<"Fertig"<<endl;
beide funktionen geben ohne das system("PAUSE") 1 zurück, das fenster wo ich dann reinschreibe erhält dann alle tastatureingaben, nachdem ich das programm beendet habe.
was in der KeyBoardHookProc in der dll gemacht wird, das macht wohl auch keinen unterschied. selbst wenn nur CallNextHookEx (hhkHook, nCode, wParam, lParam) aufgerufen wird, hängt sich das fokussierte programm auf.