How to call MessageBox with GetProcAddress function?
call, dllexport, dllimport, function, getprocaddress
Solution
Why are you declaring everything as a pointer?
`LoadLibrary` returns an `HMODULE`, not an `HINSTANCE__ *` (it will work with the latter but it's always better to adhere to the documentation).
Similarly, `msgbox` is `typedef`'d to a function pointer type, so `me` is a `msgbox`, not a `msgbox *`.
The reason why `GetProcAddress` fails is because user32.dll exports 2 functions, `MessageBoxA` and `MessageBoxW`. When you simply call `MessageBox` in your code, macros defined in Windows.h replace it with one of the 2 actual function names depending on whether you're compiling for `UNICODE` or not. But when you're trying to directly access the exported function as you are doing, you need to explicitly specify which one you're trying to get a pointer to.
#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 );
}
}
Problem
I want to call MessageBox() function in such way: 1). load needed library 2). get the function address 3). call it So, for such aim as I understand, I should define new type with all types of arguments in MessageBox function. It returnes INT and accepts: HWND, LPCSTR, LPCSTR, UNIT. So I registred new type: ``` typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); ``` I have problems with calling such function. Does such way work for all functions or only for exported? How can I call MessageBox exactly in such way? Full 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; } ```