如何使用GetProcAddress函数调用MessageBox?

时间:2012-04-12 16:53:47

标签: function call dllimport dllexport getprocaddress

我想以这样的方式调用MessageBox()函数:

1)。装载所需的库
2)。得到功能地址
3)。叫它

因此,对于我理解的目标,我应该在MessageBox函数中定义具有所有类型参数的新类型。

它返回INT并接受:HWND,LPCSTR,LPCSTR,UNIT。

所以我注册了新类型:

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

我在调用此类函数时遇到问题。这种方式适用于所有功能还是仅用于导出?
如何以这种方式完全调用MessageBox?

完整代码:

#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;
}

谢谢,
最诚挚的问候!

1 个答案:

答案 0 :(得分:4)

你为什么宣称一切都是指针?

LoadLibrary会返回HMODULE,而不是HINSTANCE__ *(它会与后者一起使用,但最好遵守文档)。

同样,msgbox typedef是函数指针类型,因此memsgbox,而不是msgbox *

GetProcAddress失败的原因是因为user32.dll导出了2个函数,MessageBoxAMessageBoxW。当您只是在代码中调用MessageBox时,Windows.h中定义的宏将替换为2个实际函数名称之一,具体取决于您是否正在编译UNICODE。但是,当您尝试直接访问导出的函数时,您需要明确指定您尝试获取指针的那个。

#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 );
  }
}