编写 C\C++ 程序时经常会使用到按标准C的方式封装好的动态链接库,用起来还比较麻烦,先要加载,后导出函数地址。
我在公司工作的时候遇上的情况:公司使用自己封装的动态链接库,每一个开发人员自己写了一套加载和导出链接库函数的类来做二次封装,到我来维护这个模块的时候,已经是乱七八糟。经常为该动态链接库加入一点点新的内容,都要同时维护多个版本的二次封装的类,不仅仅修改的时候容易遗漏,而且容易忘记哪里还有需要修改。最终忍无可忍,只有重构,统一接口。
1.使用设计模式中的单件和代理模式
1
//例子
2
class DllProxy
3
{
4
pubilc:
5![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
//加载指定的动态链接库是否成功?使用一个成员或者静态变量即可记录加载状态
7
static bool IsLoadDllSuccess();
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
//这里添加需要导出的函数接口,函数都为static修饰,里面的实现仅仅为调用原始接口
10
//![](https://www.cnblogs.com/Images/dot.gif)
static 函数
11![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
//这里释放动态链接库FreeLibrary
13
~DllProxy();
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
protected:
16
17
//这里加载动态链接库LoadLibrary
18
DllProxy();
19
20
private:
21![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
//唯一实例,该实例不可访问
23
static DllProxy s_Instance;
24
}
25![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2.这样设计拥有加载和导出动态链接库的类,可以使得程序在运行的时候就先加载动态链接库(加载的时间比main函数运行的时间还要提前),并且当程序退出的时候,该类也会自动释放加载的动态链接库。最重要的是,使用这样的Proxy类,只要类似于这样编写代码: DllProxy::函数名称(参数),就像直接使用DLL的函数一样。
3.这样设计的好处是使用这个动态链接库的开发人员不需要关注加载和导出的繁琐过程。所以比较推荐的做法是:开发这个动态链接库的开发人员编写完动态链接库后,给出一份动态链接库代理类给使用这个动态链接库的开发人员用即可,既节省了后期使用动态链接库的开发人员的开发时间,也为以后维护的时候带来便利。