C++——隐式调用动态库.dll

我对此种调用方式还不是很明确,从网上查找一些资料,如下(下面的例子只适用于对导出函数生成的dll调用,对导出类的dll调用我还没研究,如果各位朋友有好的指教,请在评论区留言,谢谢):

二、动态调用dll

    动态调用,即显式调用,是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,比较复杂,但能更加有效地使用内存。在Windows系统中,与动态库调用有关的函数包括: 
LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。 
GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。 
FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库

具体方法:(也可以称为执行的步骤,这个与后面的程序步骤对应。
1.声明头文件<windows.h>。

2.然后用typedef定义一个指针函数类型,typedef  int(*fun)(int) 。这个指针类型,要和你调用的函数类型和参数保持一致。

3.定义一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll。格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。

4.取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。FreeLibrary(hdll);

5.然后定义一个函数指针,用来获取你要用的函数地址。
先是定义一个函数指针 fun FUN;然后通过GetProcAdress来获取函数的地址,参数是DLL的句柄和你要调用的函数名:比如:FUN=(fun)GetProcAdress(hdll,"hello")。这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄。

6.然后通过函数指针来调用函数。FUN(int count);这里不能用函数名来使用函数,因为这个DLL本身不是当前CPP的一部分,而是通过windows去调用.没有在这个工程里声明或者定义,而是暴露出一个头,要指针获取他的地址,通过指针来调用。

————————————————————————————————————————————————————————————————————————

1、依据上个项目中创建的DemoDll工程。在此工程中添加新建项目,控制台程序。

然后再新建一个.cpp文件。里面的内容如下:

// XianshiInvokeDll.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include <iostream>
#include <Windows.h>
//第一步,创建一个别名,它引用的的函数类型需要和dll中的导出函数一致
typedef int (*LPDO_ARRAY) (int* pArr, int nlen);
int main()
{
    //定义一个实例句柄,引用动态库
    HINSTANCE hDll;
    //定义一个函数指针,用来指向导出函数
    LPDO_ARRAY lpDo_array;

    //第二步,加载DemoDll.dll动态库文件
    hDll = LoadLibrary(L"C:/Users/qxq/source/repos/DemoDll/x64/Debug/DemoDll.dll");
    //如果加载成功
    if (hDll != NULL)
    { 
        //第三步,获取dll中的函数地址,其中convert_arry表示类的名称。
        lpDo_array = (LPDO_ARRAY)GetProcAddress(hDll, "convert_arry");
        //如果获取成功
        if (lpDo_array != NULL)
        {
            //第四步,调用函数
            int nArr[] = { 1,34,2,35 };
            int len = sizeof(nArr) / sizeof(int);
            int nRet;

            //通过函数指针lpDo_array调用函数
            nRet = lpDo_array(nArr, len);
            std::cout << "返回值: " << nRet << std::endl;
            std::cout << "数组新值: ";
            for (int i = 0; i < len; i++)
            {
                std::cout << nArr[i] << ",";
            }
            std::cout << std::endl;
           
            //释放动态库句柄
            FreeLibrary(hDll);
        }
    }

    
    return 0;
}

然后就可以顺利调用了。

最重要的调用步骤是按照程序中的步骤进行便可。

 

2、PS:对比隐式调用和显示调用:

“隐式调用”需要3个文件:.h头文件,.lib符号文件,.dll动态库文件

“显示调用”只需要一个文件:.dll动态库文件

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值