vc的dll调用问题

news/2024/7/3 13:15:10 标签: dll, 加密, 解密, windows, winapi, library
 
 
 
引言
模块化思想贯穿于软件工程各个发展阶段,模块复用是构建大系统的一种重要思想。模块复用方法有:函数、函数库、动态链接库、COM。其都是基于模块化的基本思想。函数是最简单的模块化思想,也是后面方法的基础,甚至是一个应用程序的基础。函数库是函数的组合,一般将一些功能相似的函数放在一起作为函数库,这种函数库通常叫做静态库,其链接方式是静态的。COM即组件对象模型,是一种集成技术,可以使程序在运行时把各种不相关的软件程序混合在一起,而不必考虑这些不相关的程序是用什么语言编写的,它也是一种标准或者称为协议,负责将一个软件模块和另一个软件连接起来。动态链接库DLL(Dynamic Link Library)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源,其链接方式是动态的。动态链接库文件的扩展名一般是dll,也有可能是fon、sys和dry,它和可执行文件(.exe)非常相似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。Windows操作系统包含大量动态链接库,其中最主要的是KERNEL32.DLL、USER32.DLL、GDI32.DLL 。
 
2  DLL 的调用
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:
 
2.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.2 显式的运行时链接
隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,其能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:
①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。
②使用GetProcAddress函数得到要调用DLL中的函数的指针。
③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。
 
3  VC 中调用实例
数据加密是计算机安全领域的重要内容,其基本思想是通过变换信息的表现形式来保护敏感信息,使非授权者不能了解被保护信息的内容 [4]。常见的数据加密算法有:DES,IDEA,RSA,ECC,AES,MD5,SHA等。
《共享软件加密算法库》是一款针对个人、企业开发共享软件的加密工具,支持Windows平台下各类开发工具:VC、VB、Delphi、PB、VFP等,算法库集成的算法有:BlowFish、MD5、Secret16、AES、SHA、CRC32、RSA、DES、字符串加/解密、文件加/解密等多种功能强大的算法。其提供了DLL文件—Reg.dll,可以通过复用它来实现数据加密解密
3.   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,然后在工程相应的头文件中加入#i nclude "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()函数实现文本文件和二进制文件的解密,调用时的参数要与函数定义参数相符合。
3.   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这种模块复用方法可以减少软件工程开发的工作量,增强代码的可移植性,降低模块测试的复杂性,从总体上提高软件工程的开发效率。
 
参考文献
1 李强,贾云霞.Visual C++项目开发实践.北京:中国铁道出版社,2003:406~413
2 郎锐,罗发根.Visual C++网络通信程序开发指南.北京:机械工业出版社,2004:165~167
3 胥光辉,金凤林,丁力.软件工程方法与实践.北京:机械工业出版社,2004
4 谭安.网络攻击防护编码设计.北京:北京希望电子出版社,2002:106
5         王建国,丁丽丽.动态链接库两种调用方式的比较.微型机与应用,2002(6)
引自:http://www.jsjlw.cn/show.aspx?id=1006&cid=18

http://www.niftyadmin.cn/n/1536623.html

相关文章

人大金仓数据库安装完成之后的处理

1. 人大金仓要求必须使用 非 root用户进行安装. 但是 启动的命令 必须使用 root用户 2. 具体的方法为: cd 到安装目录 我这边的就是 /opt/Kingbase/ES/V802/Scripts 3. 需要执行处理为: [rootNeoKylin Scripts]# ./root.sh Starting KingbaseES V8.2: 等待服务器进程启动 .…

COM原理及应用---- 用Visual C++开发COM应用

1、MFC和ATL 对于COM应用的开发来说,建立一套标准的、有能够不断发展的类库是非常有意义的,这样可以实现程序的重用性。Microsoft Visual C提供了两套满足这样需要的类库:MFC库和ATL模板库。MFC不仅可用于建立COM应用,它更是一套W…

MongoDB创建系统管理员账户和数据库管理员账户

官方文档说明:https://docs.mongodb.org/manual/tutorial/manage-users-and-roles use admin db.createUser( { user: "root", pwd: "password", roles: [ "root" ] } ) use xxx db.createUser( { …

关于动态生成dom绑定事件的问题

使用Jquery的on方法绑定事件,动态生成的DOM也能触发。 需求:给classmyClass的元素绑定一个click事件 用法:$(document).on(click, .myClass, function(){}) 转载于:https://www.cnblogs.com/lyhomepage/p/5958476.html

[转帖]三款Nehalem至强5500塔式服务器横评对决(4)

三款Nehalem至强5500塔式服务器横评对决(4) http://tech.sina.com.cn/b/2009-12-14/05051172233_4.shtml可以看到两路服务器的设置 基本上用电量是 300w左右. http://www.sina.com.cn 2009年12月14日 05:05 中关村在线[商用频道][IT采购][新品速递][信息化][应用][技术趋势]…

CString,string,char*的综合比较

(一) 概述 string和CString均是字符串模板类: string为标准模板类&#xff08;STL&#xff09;定义的字符串类&#xff0c;已经纳入C标准之中&#xff1b; CString&#xff08;typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString&#xff09;为Visual C中最常用…

[转帖]任正非管理思想

任正非管理思想 作者&#xff1a; 阮一峰 日期&#xff1a; 2019年8月26日 感谢 腾讯课堂NEXT学院 赞助本站&#xff0c;腾讯官方的前端课程 免费试学。 前一段日子&#xff0c;网上出现了一个仓库&#xff0c;收集了华为公司创始人任正非的讲话稿&#xff0c;从1994年直到2018…

Wordpress插件开发1 创建插件并设置插件信息

【本文出处: http://blog.csdn.net/leytton/article/details/52820395】 在Wordpress的plugins目录下新建插件文件夹例如"iHuZheVideoManager" 在"iHuZheVideoManager"文件夹下新建index.php文件&#xff0c;添加注释 <?php /* Plugin Name: iHuZhe管…