动态库如何动态加载
1、LoadLibrary函数的声明如下,它只有一个参数,指明要加载的动态库。

2、GetProcAddress函数的声明如下,它有两个参数,一个是LoadLibrary函数返回的模块句柄,一个是要获取的函数名称。

1、这里以user32.dll中的MessageBox函数为例,开发环境使用vs2017。首先点击“文件”——“新建”——“项目”建立一个win32控制台程序。


2、正常的使用MessageBox代码如下,直接调用即可。
//vs2017中的代码
#include <tchar.h>
#include <windows.h>
int main(){
MessageBox(0, _T("hello world!"), _T("MessageBox"), MB_OK);
return 0;
}

3、如果使用动态加载,则需要首先用LoadLibrary函数加载user32.dll。

4、然后定义一个函数指针类型,用定义的函数指针类型定义函数指针。用于保存GetProcAddress()获取的MessageBox函数地址。

5、然后通过GetProcAddress()获取其函数地址。

6、最后通过函数指针调用MessageBox()函数即可。

7、所有代码及运行效果如下://添加上Api函数调用声明文件
#include <tchar.h>
#include <windows.h>
int main(){
//加载user32.dll
// 因为MessageBox()在user32.dll中导出
HMODULE hdll = LoadLibrary(_T("user32.dll"));
//如果加载成功则获取MessageBox函数的地址。
if (hdll) {
//首先定义一个用于指向MessageBox函数的函数指针类型
typedef int(__stdcall *pfunc)(HWND, LPCWSTR, LPCWSTR, UINT);
//用GetProcAddress()获取其地址
pfunc pmsgbox = (pfunc)GetProcAddress(hdll, "MessageBoxW");
//通过函数指针调用MessageBox
pmsgbox(0, _T("hello world!"), _T("MessageBox"), MB_OK);
}
return 0;
}
