动态链接库
动态链接库:
动态链接库英文DLL 是Dynamic Libarary得缩写。
DLL中包含若干公用的代码、数据等,可供其他模块(DLL或exe文件等)使用
DLL中并不是所有的函数都必须供其他模块使用,只有经过** 导出(export)**后才允许被外部正常调用
动态的由来
DLL最初用于节约应用程序所需要的磁盘空间和内存空间。早前在传统的非共享库中,一部分代码简单的附加到调用的程序中,
如果两个程序同时调用一个子程序,就会出现两份代码
WindowsAPI就存在与动态链接库中。对于多个进程共同使用的DLL文件来说,在屋里内存中只有一份文件,不过是被分别映射到了不同的进程内存空间,从而极大的降低了内存的消耗
DLL与Exe的区别
入口函数:DllMain函数是DLL模块的默认入口点。当windows加载DLL模块时调用这一函数。 如果没有DLLMain函数程序也能正常运行,此函数是可选函数。
DLL导出(方式一)
作为一个DLL文件,它的最大作用就是提供函数给其他的模块使用,提供的函数叫导出函数。
导出方式:1.声明导出 2.模块定义文件导出
除了导出函数外,dll文件还可以导出遍历,c++类
extern "C" declspec(dllexport) function
DLL方式导出二
创建文件为.def
LIBRARY "mydll" //导出dll名称
EXPORTS
my_min @ 1 //函数名 @序号
对于dll项目,编译器通常会产生两个文件,分别是 .DLL.lib其中dll是动态链接库,保存了所有的代码和数据,lib是导入库
保存了一些符号和地址的对应信息。不能单独使用,必须与dll共存。用于动态链接库的隐式链接。
DLL导入
通过隐式链接的方式调dll导出的函数
#pragma comment(lib,"xx.lib")
extern "C" int my_export(int a ,int b);
显示链接方式调用导出函数
LoadLibrary()API函数
//加载dll 参数:dll的文件路径
HMODULE hModule = LoadLibrary(L"mydll.dll") ;
//获取相应函数 第一个参数 模块句柄 第二个参数: 函数的名称
GetProcessAddress(hModule,"");
FreeLibrary();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix