function - 如何使用 GetProcAddress 函数调用 MessageBox?

标签 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;
}

最佳答案

您为什么将所有内容都声明为指针?

LoadLibrary 返回 HMODULE ,而不是 HINSTANCE__ * (它适用于后者,但最好遵守文档)。

同样,msgboxtypedef 'd 到函数指针类型,所以 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 );
  }
}

关于function - 如何使用 GetProcAddress 函数调用 MessageBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10128148/

相关文章:

vb.net - 获取事件窗口的标题

c# - C# 中的 C++ 结构

function - 可变数量和函数的正确行为

function - 在go函数中将函数作为参数传递

javascript - 尝试在 React w/Formik 中每次输入字段完成时创建一个计数器

javascript - 如果在 map 函数: Getting unexpected error内

python - 可以在 Python 中按名称(作为字符串)调用 XML-RPC 方法吗?

linux - 在系统调用中是否保存了硬件和软件上下文?

javascript - 有没有安全的方法调用 `call` 来调用 JavaScript 中的函数?

c# - 带有非导出函数的 DllImport。为什么有效?