动态链接库加载函数的两种方法及区别

动态链接库的编写:
1.创建一WIN32动态链接库工程Dll1,添加一C++源文件Dll1.cpp,在源文件中编写一个测试函数
int _stdcall add(int a, int b)
{
    return (a+b);
}
2.定义一模块定义文件Dll1.def,在里面添加如下内容:
LIBRARY Dll1
EXPORTS
add
该文件的作用是导出函数
3.添加一个Dll1.h文件,该文件的作用是提供给调用者进行静态链接,在该文件中添加如下内容:
int _stdcall add(int a, int b);
备注:使用模块定义文件而不使用extern "C" __declspec(dllexport)的好处是:
即使更改了调用约定,导出函数也不会进行名字改编;而如果改成
extern "C" __declspec(dllexport) int _stdcall add(int a, int b)
查看导出函数为_add@8,进行了名字改编。使用模块定义文件的目的是方便动态库在其他语言中调用。(C语言的默认调用约定是_cdecl)

动态链接库的调用:
第一种是静态链接方式,在这种方式下,动态链接库中的所有数据代码都将拷贝到调用程序的代码空间中去,此时它和调用程序本身的函数没有什么区别;
第二种是动态链接方式,在这种方式下,动态链接库中的数据代码是在需要的时候才拷贝到内存中去的;
两种方式都可以将外部(动态链接库中的)代码资源提供给调用者使用,但前者是全局的,虽随时可以使用,但会增加内存;而后者是局部的,虽节省了内存,但会增加调用时间。
因此,在实际应用中应根据需要选择哪种方式,一般多次调用则采用静态链接方式,而单次调用则采用动态链接方式。
这两种链接方式的调用方法如下
静态调用:

#include

#pragma comment(lib, "Dll.lib")


动态调用:

HINSTANCE hInst;

hInst = LoadLibrary("Dll.dll");

typedef int (*pFunc)(int, int);

pFunc pAdd = NULL;

pAdd = (pFunc)GetProcAddress(hInst, "add");

if (pAdd)

{

    //使用动态库中的函数

}

FreeLibrary(hInst);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值