Problem mit FARPROC
-
FARPROC _MessageBox; HMODULE dll; dll = LoadLibrary((LPCWSTR)"user32.dll"); _MessageBox = GetProcAddress(dll, "MessageBoxW"); _MessageBox(0, "Message", "Hello!", MB_OK);Der Compiler spruckt die Fehlermeldung error C2197: "FARPROC": Zu viele Argumente für Aufruf. aus. Wieso?
-
Eine FARPROC hat keine Parameter:
typedef INT_PTR (WINAPI *FARPROC)(void);Du musst einen eigenen Funktions-Zeiger Typ verwenden, der der Signatur von MessageBox entspricht, und dann bei GetProcAddress entsprechend casten.
-
hustbaer schrieb:
Eine FARPROC hat keine Parameter:
typedef INT_PTR (WINAPI *FARPROC)(void);Du musst einen eigenen Funktions-Zeiger Typ verwenden, der der Signatur von MessageBox entspricht, und dann bei GetProcAddress entsprechend casten.
Wie kann ich das machen? Kannst Du mir ein Beispiel zeigen?
Ich habe es jetzt so gemacht:
typedef int (*MYPROC)(HWND, LPCTSTR, LPCTSTR, UINT); int main() { MYPROC _MessageBox; HMODULE dll; dll = LoadLibrary(L"user32.dll"); _MessageBox = (MYPROC)GetProcAddress(dll, "MessageBoxA"); _MessageBox(0, (LPCTSTR)"blabla", (LPCTSTR)"bla", MB_OK); }Nun kriege ich nen Runtime Check Failure:
`Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.`
Was mache ich falsch?
-
skullyan schrieb:
Was mache ich falsch?
2 Dinge:
typedef int (WINAPI *MYPROC)(HWND, LPCSTR, LPCTSTR, UINT);Du hast beim Callback die Calling Convention nicht angegeben die aber bei MessageBox stdcall ist und by default ist es cdecl, was deins auch war.
=> Fehler2. LPCTSTR schreiben und explizit mit C-Cast hantierst was schwachsinn ist und du LPCTSTR hier nicht verwenden kannst weil du explizit die ANSI version lädst
typedef int (WINAPI *MYPROCA)(HWND, LPCSTR, LPCSTR, UINT); int main() { MYPROC _MessageBox; HMODULE dll; dll = LoadLibrary(L"user32.dll"); _MessageBox = (MYPROC)GetProcAddress(dll, "MessageBoxA"); _MessageBox(0, "blabla", "bla", MB_OK); }