动态库如何动态加载

2025-07-05 23:29:23

动态链接库的动态加载,依靠LoadLibrary()和GetProcAddress猾诮沓靥()两个Api函数,前者用于加载动态库,后者用于获取动态库相应函数的地址。

工具/原料

vs2017

一、需要的API函数

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

动态库如何动态加载

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

动态库如何动态加载

二、动态加载动态库的实例

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

动态库如何动态加载
动态库如何动态加载

2、正常的使用MessageBox代码如下,直接调用即可。//vs2017中的代码#include <t艘早祓胂char.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;}

动态库如何动态加载
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢