2012-04-12 11 views
3

Ich möchte MessageBox() Funktion auf folgende Weise aufrufen:
Wie MessageBox mit GetProcAddress Funktion aufrufen?

1). Laden benötigte Bibliothek
2). Holen Sie sich die Funktion Adresse
3). Nennen Sie es

Also, für ein solches Ziel, wie ich verstehe, sollte ich einen neuen Typ mit allen Arten von Argumenten in MessageBox-Funktion definieren.

Es kehrt INT zurück und akzeptiert: HWND, LPCSTR, LPCSTR, UNIT.

So angemeldet ich neue Art:

typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); 

Ich habe Probleme mit einer solchen Funktion aufrufen. Funktioniert das für alle Funktionen oder nur für exportierte?
Wie kann ich MessageBox genau so aufrufen?

Voll Code:

#include <iostream> 
#include <windows.h> 

using namespace std; 

typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); 

int main(void) 
{ 
    HINSTANCE__ *hModule = LoadLibrary(L"\\Windows\\System32\\User32.dll"); 
    msgbox *me = 0; 

    if(hModule != 0) 
    { 
     me = (msgbox*)GetProcAddress(hModule, "MessageBox"); 
    } 

    return 0; 
} 

Danke,
Mit freundlichen Grüßen!

Antwort

3

Warum deklarieren Sie alles als Zeiger?

LoadLibrary gibt HMODULE zurück, kein HINSTANCE__ * (es wird mit letzterem funktionieren, aber es ist immer besser, sich an die Dokumentation zu halten).

Ebenso ist msgboxtypedef ‚d zu einem Funktionszeigertyp, so ist ein memsgbox, kein msgbox *.

Der Grund, warum GetProcAddress fehlschlägt, ist, weil user32.dll 2 Funktionen, MessageBoxA und MessageBoxW exportiert. Wenn Sie in Ihrem Code einfach MessageBox aufrufen, ersetzen die in Windows.h definierten Makros sie durch einen der beiden tatsächlichen Funktionsnamen, je nachdem, ob Sie für UNICODE kompilieren oder nicht. Wenn Sie jedoch gerade versuchen, direkt auf die exportierte Funktion zuzugreifen, müssen Sie explizit angeben, auf welche Datei Sie einen Zeiger richten möchten.

#include <iostream> 
#include <windows.h> 

typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); 

int main(void) 
{ 
    HMODULE hModule = ::LoadLibrary(L"User32.dll"); 
    msgbox me = NULL; 

    if(hModule != NULL) { 
    me = reinterpret_cast<msgbox>(::GetProcAddress(hModule, "MessageBoxA")); 
    } 

    if(me != NULL) { 
    (*me)(NULL, "I'm a MessageBox", "Hello", MB_OK); 
    } 

    if(hModule != NULL) { 
    ::FreeLibrary(hModule); 
    } 
} 
+0

Vielen Dank für so einen guten Rat! –

+0

Weißt du nicht, wie man nicht exportierte Funktionen in DLL aufruft? Vielen Dank! –

+0

@ user1131997 Ich glaube nicht, dass es eine Möglichkeit gibt, das zu tun – Praetorian