动态链接库的使用
fangyukuan
2010.6.21
应用程序可以调用的DLL函数,在DLL中叫做导出函数,而在应用程序中叫做导入函数。应用程序中的导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。
一、隐式链接
在建立一个DLL文件时,编译器会自动生成一个与该文件对应的导入库文件(扩展名为lib)。该文件包含了DLL中所有导出函数所有DLL库的名称,应用程序可以根据这个文件来寻找并加载DLL。由于在程序中没有出现加载DLL的代码,所以把这种链接方式叫做隐式链接。
Windows搜索DLL的顺序为:
1. 包含应用程序EXE文件的目录。
2. 进程的当前工作目录。
3. Windows系统目录。
4. Windows目录。
5. 列在Path环境变量中的一系列目录。
例子:
声明导入函数。
#include "stdafx.h"
void SayHello(void);
int _tmain(int argc, _TCHAR* argv[])
{
SayHello();
return 0;
}
另外在工程设置好lib的路径。
如果没有设置好,将连接不过。如下:
>Linking...
1>2_DLLDemoCall.obj : error LNK2019: unresolved external symbol "void __cdecl SayHello(void)" (?SayHello@@YAXXZ) referenced in function _wmain
二、显式链接
例子见:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761464.html
如果在应用程序中使用Windows API函数直接完成DLL库函数的调用,那么这种做法就叫做DLL的显式方式,当然这不必使用导入库文件了。
方法如下:
1获得DLL库
通过调用Win32的LoadLibrary 函数,并以要使用的DLL文件所在的路径为参数,可以取得DLL。LoadLibaray函数的原型如下:
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // DDL的路径
);
函数的返回值为DLL库的句柄。
2.获得DLL函数
获得了DLL的句柄之后,接下来就可以在应用程序中通过调用Win32 API函数GetProcAddress来获得该DLL中与导入函数相匹配的导出函数了。原型如下:
FARPROC
GetProcAddress(
HMODULE hModule, // handle to DLL module DLL的句柄
LPCSTR lpProcName // name of function 导入函数的名称
);
GetProcAddress函数的返回值为DLL导出函数地址。
3释放DLL库
在使用完DLL之后,必须用FreeLibrary函数来释放动态链接库。原型如下:
BOOL
FreeLibrary(
HMODULE hLibModule // handle to loaded library module DLL句柄
);
采用显式链接方式调用DLL库,程序员可以决定加载哪个DLL文件,这使得程序的设计更为灵活。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)