当前位置:首页 > 工业控制 > 电子设计自动化
[导读]摘 要:介绍了动态链接库这种模块复用方法及在VC中对它的调用,并给出了一个通过复用来实现数据加密的具体实例。引言模块化思想贯穿于软件工程各个发展阶段,模块复用是构建大系统的一种重要思想。模块复用方法有:函

摘 要:介绍了动态链接库这种模块复用方法及在VC中对它的调用,并给出了一个通过复用来实现数据加密的具体实例。

引言

模块化思想贯穿于软件工程各个发展阶段,模块复用是构建大系统的一种重要思想。模块复用方法有:函数、函数库、动态链接库、COM。其都是基于模块化的基本思想。函数是最简单的模块化思想,也是后面方法的基础,甚至是一个应用程序的基础。函数库是函数的组合,一般将一些功能相似的函数放在一起作为函数库,这种函数库通常叫做静态库,其链接方式是静态的。COM即组件对象模型,是一种集成技术,可以使程序在运行时把各种不相关的软件程序混合在一起,而不必考虑这些不相关的程序是用什么语言编写的,它也是一种标准或者称为协议,负责将一个软件模块和另一个软件连接起来。动态链接库DLL(Dynamic Link Library)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源,其链接方式是动态的。动态链接库文件的扩展名一般是dll,也有可能是fon、sys和dry,它和可执行文件(.exe)非常相似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。Windows操作系统包含大量动态链接库,其中最主要的是KERNEL32.DLL、USER32.DLL、GDI32.DLL 。

DLL的调用

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:

1、隐式的加载时链接

这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。当这个应用程序运行时,也就是它的可执行文件被操作系统产生映像文件时,系统会查看这个映像文件中关于DLL的信息,然后将这个DLL文件映像到进程的地址空间。

系统通过DLL文件的名称,试图加载这个文件到进程地址空间时,它寻找DLL 文件的路径按照先后顺序如下:

·程序运行时的目录,即可执行文件所在的目录;

·当前程序工作目录

·系统目录:对于Windows95/98来说,可以调用GetSystemDirectory函数来得到,对于WindowsNT/2000来说,指的是32位Windows的系统目录,也可以调用GetSystemDirectory函数来得到,得到的值为SYSTEM32。

·Windows目录

·列在PATH环境变量中的所有目录

VC中加载DLL的LIB文件的方法有以下三种:

①LIB文件直接加入到工程文件列表中

在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。

②设置工程的 Project Settings来加载DLL的LIB文件

打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。

③通过程序代码的方式

加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。

当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。

2、显式的运行时链接

隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,其能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:

①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。

②使用GetProcAddress函数得到要调用DLL中的函数的指针。

③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。

VC中调用实例

数据加密是计算机安全领域的重要内容,其基本思想是通过变换信息的表现形式来保护敏感信息,使非授权者不能了解被保护信息的内容。常见的数据加密算法有:DES,IDEA,RSA,ECC,AES,MD5,SHA等。

《共享软件加密算法库》是一款针对个人、企业开发共享软件的加密工具,支持Windows平台下各类开发工具:VC、VB、Delphi、PB、VFP等,算法库集成的算法有:BlowFish、MD5、Secret16、AES、SHA、CRC32、RSA、DES、字符串加/解密、文件加/解密等多种功能强大的算法。其提供了DLL文件-Reg.dll,可以通过复用它来实现数据加密与解密。

1、隐式链接

其提供了 Reg.h与Reg.lib两个隐式链接所必须的文件,所以可以采用此种方式。

①在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入Reg.lib。

②在VC中打开File View一页,选中Header files,单击鼠标右键,然后选中"Add Files to Folder"菜单,在弹出的文件对话框中选中要加入Reg.h,然后在工程相应的头文件中加入#include "Reg.h"。在Reh.h头文件中给出了DLL中定义的函数原型及声明。

如:加密函数原型及声明为extern "C" BOOL WINAPI File Encrypt(LPCTSTR lpInputFileName, LPCTSTR lpOutputFileName, LPCTSTR lpKey, LPCTSTR lpRegisterCode);解密函数原型及声明为extern "C" BOOL WINAPI File Decrypt(LPCTSTR lpInputFileName, LPCTSTR lpOutputFileName, LPCTSTR lpKey, LPCTSTR lpRegisterCode)。其中对于WINAPI宏,把它加到函数原型定义前,系统会把它翻译为适当的调用方式,在Win32中,是把它翻译为_stdcall调用方式。

③直接调用所需要的加密与解密函数,如调用File Encrypt()函数实现文本文件和二进制文件的加密,调用File Decrypt()函数实现文本文件和二进制文件的解密,调用时的参数要与函数定义参数相符合。

2、显式链接

如果只提供Reg.dll一个文件,那么须用此种方式。

①加密模块:调用File Encrypt()函数实现文本文件和二进制文件的加密。

//装载加密/解密DLL
HINSTANCE hdll=::Load Library ("Reg.dll");
//通过类型定义语句typedef来定义函数指针类型
Typedef BOOL (_stdcall *lpFileEncrypt)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
//函数声明
LpFileEncrypt FileEncrypt1;
//获取加密函数File Encrypt的函数指针
FileEncrypt1=(lpFileEncrypt)::GetProcAddress(hdll,"FileEncrypt");
//调用DLL中加密函数File Encrypt对文件加密,user-12345678为软件注册号
FileEncrypt1(加密源文件名,加密生成目标文件名,密码,"user-12345678");
//释放DLL模块
::AfxFreeLibrary(hdll);

②解密模块:调用File Decrypt()函数实现文本文件和二进制文件的解密。

//装载加密/解密DLL
HINSTANCE hdll=::Load Library ("Reg.dll");
//通过类型定义语句typedef来定义函数指针类型
Typedef BOOL (_stdcall *lpFileDecrypt)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
//函数声明
LpFileDecrypt FileDecrypt2;
//获取解密函数File Decrypt的函数指针
FileDecrypt2=(lpFileDecrypt)::GetProcAddress(hdll,"FileDecrypt");
//调用DLL中解密函数FileDecrypt对文件加密,user-12345678为软件注册号
FileDecrypt2(解密源文件名,解密生成目标文件名,密码,"user-12345678");
//释放DLL模块
::AfxFreeLibrary(hdll);

结束语

利用DLL这种模块复用方法可以减少软件工程开发的工作量,增强代码的可移植性,降低模块测试的复杂性,从总体上提高软件工程的开发效率。



来源:ks990次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在人工智能的发展历程中,我们往往认为更多的训练、更复杂的数据能让 AI 变得更加智能。然而,近期一些研究却揭示了令人意外的现象:对小型 AI 语言模型进行数学训练时,过度训练可能会导致其表现急剧下降,甚至出现 “变笨”...

关键字: 人工智能 数据 模型

I2C 总线的起始条件和终止条件通常由主机产生。起始条件是在 SCL 高电平时,SDA 从高电平转为低电平;而终止条件则是当 SCL 高电平时,SDA 从低电平转化为高电平。这两个条件的准确识别对于 I2C 通信的正确启...

关键字: I2C 总线 数据 协议

在AI数据产业中,数据精准度=验收合格数量/全部数量,这意味极高的精准度不仅要满足一些客观标准,还需要与AI项目方的需求深度契合,通过基于需求的验收过程。

关键字: AI 数据

基于使用困难报告系统(SDRS)对钻石DA20飞机的故障数据进行分析 。基于SDRS系统收集到的数据 , 结合故障分类方法 ,对钻石DA20飞机的不同故障进行研究 ,并提出相应的解决措施 ,有利于提高钻石DA20飞机机队...

关键字: SDRS DA20飞机 故障 数据

在当今数字化时代,数据如同流淌在信息高速公路上的血液,驱动着各个领域的创新与发展。而在嵌入式视觉领域,高速数据传输正扮演着越来越关键的角色,它不仅是实现实时、精准视觉感知的基础,更是开启未来智能应用无限可能的钥匙。

关键字: 数据 视觉 传输

在如今数字化的时代,SD 卡作为一种常见的存储设备,承载着我们大量珍贵的记忆和重要的资料,如精彩的照片、珍贵的视频以及关键的文档等。然而,令人头疼的是,SD 卡数据丢失的情况时有发生,可能是由于误删除、格式化、病毒感染、...

关键字: 内存卡 数据

如今,我们正处于一个被无处不在的数据及高耗电应用所驱动的信息计算世界中,使得电源管理成为了不同系统、网络和软件所面临多方面挑战中的不可忽视的一环。

关键字: 数据 高耗电 电源管理

近年来,国内某知名钢铁集团致力于推动传统钢铁主业的高质量发展,通过提高电控自动化水平,进一步优化产品质量和产能效率,不断提升市场竞争力。

关键字: 魏德米勒 电力 信号 数据

北京——2024年4月30日 亚马逊云科技持续引领云上数据服务创新,助力企业构建全面的数据基座以充分发挥数据潜力,加速生成式AI技术落地。在生成式AI时代,数据是企业脱颖而出的关键——基础模型依赖于大规模高质量数据集,生...

关键字: 生成式AI 数据 模型

全新的专有模型导入功能让客户更轻松地将其专属模型导入到Amazon Bedrock中,从而充分利用Amazon Bedrock的强大功能。全新的模型评估功能使客户能够广泛且便捷地选择完全托管模型,包括RAG优化的新版Am...

关键字: 生成式AI 基础模型 数据
关闭