[转]

动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数和 类定义在库中。这样,在再次使用这些函数和类的时候,就不再需要重新添加与这些函数和类相关的代码。具有共性的问题大致有哪些呢?笔者归纳如下 :

(1)通用的算法

图像处理、视频音频解码、压缩与解压缩、加密与解密通常采用某些特定的算法,这些算法较固定且在这类程序中往往 经常被使用。

(2)纯资源DLL

我们可以从DLL中获取资源,对于一个支持多种语言的应用程序而言,我们可以判断操作系统的语言,并自动为应用程 序加载与OS对应的语言。这是多语言支持应用程序的一般做法。

(3)通信控制DLL

串口、网口的通信控制函数如果由DLL提供则可以使应用程序轻松不少。在工业控制、modem程序甚至socket通信中, 经常使用通信控制DLL。

本节将给出DLL的三个典型应用实例。

7.1 算法DLL

我们直接用读者的一个提问作为例子。

宋宝华先生,您好!

我在dev.yesky.com上看到你连载的《VC++动态链接库编程》,觉得非常好。我以前主要是用Delphi的,C/C++学过, 对Win32和VCL比较熟悉,但是没有接触过VC++,对MFC很陌生。这段时间和一个同学合作做光学成像的计算机模拟,用到傅立叶变换,手里面有例程 是VC++写的。我们的界面是用Delphi开发,需要将其傅立叶变换功能提出做一个DLL供Delphi调用。苦于不懂MFC,试了很多方法,都不成功,最后只 得采用折衷方案,简单修改一下程序,传一个参数进去,当作exe来调用,才没有耽搁后续进程。

……

谢谢!

礼!

某某

学习过较高级别数学(概率统计与随机过程)、信号与线性系统及数字信号处理的读者应该知道,傅立叶变换是一种在 信号分析中常用的算法,用于时域和频域的相互转换。FFT变换算法通用而有共性,我们适宜把它集成在一个DLL中。

随后,这位读者提供了这样的一个函数:

 

既然有了FFT这个函数,我们要把它做在DLL中,作为DLL的一个接口将是十分简单的,其步骤如下:

(1)利用MFC向导建立一个非MFC DLL;

(2)在工程中添加fft.h和fft.cpp两个文件;

fft.h的源代码为:

fft.cpp的源代码为:

在任何编程语言中使用Win32 API LoadLibrary都可以加载这个DLL,而使用GetProcAddress(hDll, "FFT")则可以获得函 数FFT的地址,读者所提到的Delphi当然也不例外。

这个DLL中有两点需要注意:

(1)使用extern "C"修饰函数声明,否则,生成的DLL只能供C++调用;

(2)使用__stdcall修饰函数声明及定义,__stdcall是Windows API的函数调用方式。

 

7.2纯资源DLL

我们在应用程序中产生如图18所示的资源(对话框)

 

dll_res

图18 中文对话框

在与这个应用程序相同的工作区里利用MFC向导建立两个简单的DLL,把应用工程中的资源全选后分别拷贝到 ChineseDll和EngLishDll,在EnglishDll工程的资源文件中搜索下面的语句:

 

 

将其改为:

并将其中所有的中文翻译为英文。这个DLL为我们提供了如图19所示的对话框资源。

call dll resource

图19英文对话框

修改应用工程的InitInstance()函数,在

之前(即对话框显示之前)添加如下代码:

这样的应用程序将具有自适应性质,在中文OS中显示中文资源,在英文OS中则显示英文资源。

 

7.3通信控制DLL

 

我们在这里举一个串口通信类的例子。

也许您需要了解一点串口通信的背景知识,其实串口到处都看得到,譬如PC机的COM口即为串行通讯口(简称串口)。 如图20,打开Windows的设备管理器,我们看到了COM口。

在Windows系统,需通过DCB(Device Control Block)对串口进行配置。利用Windows API GetCommState函数可以获取 串口当前配置;利用SetCommState函数则可以设置串口通讯的参数。

串行通信通常按以下四步进行:

(1)打开串口;

(2)配置串口;

(3)数据传送;

(4)关闭串口。

com口图片

                   图20 PC的串口

由此可见,我们需要给串口控制DLL提供如下四个接口函数:

 

 

我们编写一控制台程序来演示DLL的调用:

DLL的编写与调用方法及主要应用皆已讲完,在下一节里,我们将看到比较“高深”的主题――DLL木马。曾几何时,DLL 木马成为了病毒的一种十分重要的形式,是DLL的什么特性使得它能够成为一种病毒? 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值