visual c++ 动态链接库调用总结
由于每次使用动态链接库的时候都要重新去查资料,查调用方式,有些烦躁,本人抽点时间在此做个总结,希望可以对需要的朋友有所帮助。
1,显式加载方式加载动态链接库
简单易懂,随掉随用
(1) 将dll考到当前工作目录,或者使用GetModuleFileName函数获取当前执行目录得到相对路径,亦或者使用绝对路径进行加载。
(2) 得到dll实例句柄
HMODULE LoadLibrary( LPCTSTR lpFileName )
( 3 ) 获取dll中导出函数的地址
FARPROC GetProcAddress( HMODULE hModule,LPCSTR lpProcName )
Ex:typedef int (*ADDPROC)( int a, int b )
ADDPROC Add=(ADDPROC)GetProcAddress(hinst,”add”);
(4)FreeLibrary()调用结束释放实例。
2 隐式加载方式加载动态链接库
一:基本调用流程
(1) 使用_declspec(dllexport)导出函数
_declspec(dllexport) int add( int a, int b )
添_stdcall extern c可有效解决名字改编问题
_stdcall extern c _declspec(dllexport) int add( int a, int b )
(2) 将dll文件考到当前工程,并连接lib文件
Vc6可以通过link连接,vs系列可以通过依赖库连接
或者使用一种通用的方式加载,通过路径加载
#pragma comment(lib,"../SDK/Sadp.lib")
(3)在调用处用extern做外部定义声明
Ex:extern int add( int a , int b )
或者_declspec(dllimport) int add( int a, int b )
二:模块定义文件(可有效解决名字改编问题)参考网络通信库
Library xxx.dll
EXPORTS
Add。。。。
3 显式加载和隐式加载的比较
个人比较崇尚显示加载两个原因:
1, 随掉随用,易懂,并且不会因为某一个导出函数的调用的失败导致程序的崩溃
2, 节省内存,调用结束直接释放实例,而隐式加载从程序开始运行就一直伴随着程序的整个过程,当dll比较多的时候很浪费内存。