显示加载dll

本文介绍了如何使用Windows API中的LoadLibrary、GetProcAddress和FreeLibrary函数来动态加载DLL,并调用其中的函数。LoadLibrary通过指定DLL文件名获取模块句柄,GetProcAddress根据句柄和函数名获取函数地址,而FreeLibrary用于释放已加载的DLL模块。通过示例展示了如何处理DLL函数导出名称的变化问题,以及使用DEF文件防止DLL编译后名称改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 显示加载dll
    1. HMODULE LoadLibrary(LPCTSTR lpFileName);
      1. lpLibFileName 指定要载入的动态链接库的名称
      2. 返回HMODULE,成功则返回库(即dll)模块的句柄,零表示失败,HMODULE和 HINSTANCE一样
      3. 注:这个函数也可以加载可执行模块exe文件,用以访问对话框、位图、图标资源
    2. FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName );
      1. hModule 包含此函数的DLL模块的句柄
      2. lpProcName 包含dll函数名的以NULL结尾的字符串
      3. 如果函数调用成功,返回值是DLL中的输出函数地址。如果函数调用成功,返回值是DLL中的输出函数地址。
    3. BOOL FreeLibrary(HMODULE hModule);
      1. hModule 为要释放的那个Dll的模块句柄。
void CTestDllDlg::OnBnClickedBtnAdd()
{
    // TODO: 在此添加控件通知处理程序代码
    HINSTANCE hinst;
    hinst=LoadLibrary(_T("Dll1.dll"));//显示加载dll
    //int add(int a,int b);
    typedef int (*ADDPROC)(int a,int b);//定义的add函数指针
    ADDPROC Add=(ADDPROC)GetProcAddress(hinst,"?add@@YAHHH@Z");//获得dll中的add函数地址
    if(!Add)
    {
        MessageBox(_T("获取函数地址失败"));
        return;
    }
    CString str;
    str.Format(_T("5+3=%d"),Add(5,3));
    MessageBox(str);
    FreeLibrary(hinst);//释放dll模块句柄
}

注:仅需要把Dll1.dll放到工程文件目录下即可 ,其中?add@@YAHHH@Z为函数add导出后变为的名字。当然也可以用def文件不让Dll1.dll编译后名字改变。
- 用def解决名字改变的问题,其中add,subtract,output(类中函数)为Dll2中的函数

LIBRARY
EXPORTS
add
subtract
output

这里写图片描述
这里写图片描述
此时上面的显示调用Dll2中函数名可以更改

    ADDPROC Add=(ADDPROC)GetProcAddress(hinst,"add");//获得dll中的add函数地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值