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比较多的时候很浪费内存。



原文地址:https://www.cnblogs.com/jiangu66/p/3231118.html