Anwendung stürzt ab, wieso?
-
Hallo!
Wieso stirbt dieser Code beim Aufruf der Funktion test?typedef int(*MessageBox_fn)(HWND hWnd, LPCSTR message, LPCSTR topic, UINT uType); HMODULE hLib; MessageBox_fn test; hLib = LoadLibrary("D:\\WINNT\\SYSTEM32\\USER32.dll"); if(hLib == NULL) { MessageBox(0, "Lib not found", 0, 0); } test = (MessageBox_fn)GetProcAddress(hLib, "MessageBoxA"); if(test == NULL) { MessageBox(0, "Function not found", 0, 0); } test(0, "blubb", "mwhahaha", 0); FreeLibrary(hLib);
Danke schonmal
Kevin
edit: Codetags korrigiert.
-
Bei mir ist MessageBoxA anders deklariert:
int WINAPI MessageBoxA(HWND, LPCSTR, LPCSTR, UINT);
Achte auf "WINAPI".
-
bin ich einfach nur selten blöd oder extrem dumm?
typedef int WINAPI (*MessageBox_fn)(HWND hWnd, LPCSTR message, LPCSTR topic, UINT uType);
bringt mir mehrere Syntaxfehlereine Messagebox wird ja aufgerufen, nur danach stirbt mir die Anwendung unter dem Skalpell weg
Kevin
-
Das WINAPI gehört nicht zum Rückgabewert, sondern zur Funktion:
typedef int (WINAPI MessageBoxFunc)(HWND, LPCSTR, LPCSTR, UINT); MessageBoxFunc* test = 0;
Alternative:
typedef int (WINAPI * MessageBoxPtr)(HWND, LPCSTR, LPCSTR, UINT); MessageBoxPtr test = 0;
Bei der ersten Variante wird klarer, dass es sich um einen Zeiger handelt.
-
vielen dank, funktioniert *freu*
-
-
hmm wie sehe das bei
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);aus?
typedef BOOL (WINSHELLAPI WINAPI *Shell_NotifyIconA_fn)(DWORD dwMessage, PNOTIFYICONDATAA lpData);ist nicht
Kevin
-
warum willst du überhaupt die funktionen dynamisch laden, die es sowieso ab jeder windows version ab 95 gibt?
-
Weil isch nen Progg schreibe dass anzeigt welche Api Funktionen benutzt werden
Dazu brauch ich das halt
-
WINSHELLAPI wird entweder zu extern "C" oder zu nix. In beiden Fällen kannst du es beim typedef weglassen.
-
ich mache zu einigen DLLs von windows fake dlls und ersetz diese dann, so dass immer wenn eine API funktion aufgerufen wird die aus meiner fake dll geladen wird welche dann die richtige aufruft, so kann ich z.b. die parameter fälschen. ist es möglich herauszufinden welche Anwendung die Funktion ausgeführt hat? vielleicht sowas wie getcurrentprocess oder so
-
Hast du keine platform-SDK Doku?
Es gibt nämlich wirklich die Funktion GetCurrentProcess. Wenn du die ID brauchst, die liefert dir GetCurrentProcessId.
-
Is ja cool
wie krieg ich aus dem zurückgegebenen HANDLE den Dateinamen / das HWND? weißt du das auch noch? *g*
-
GetModuleFileName - das mit dem HWND ist eben keine eindeutige Zuordnung, da die Anwendung ja mehrere Fenster hat.
Alle dazugehörigen Fenster solltest du mit EnumWindows und GetWindowThreadProcessId herausfinden. Evtl. hilft dir aber auch GetForegroundWindow o.ä.