关于DLL的学习
1.前言:
人总归还是要有梦想的,不然跟咸鱼有什么区别。这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己。话说为什么要给自己下这样一个任务呢,是因为在研究数据库编程的过程中看到了书上写着相关DLL的编写问题,感觉也挺有意思的,不妨先来研究一下DLL。
2.DLL概论:
DLL(Dynamic Link Library):DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。(以上摘自百度百科.意义)
按照我的理解,引用一个DLL就好似 #include 了某一个.h文件,其中有许多我们待用的函数或者变量或者类等可以供我们调用。 而在DLL发展的过程中经历了“无库-静态链接库-动态链接库”的时代。(.h文件只是一个类比..有些不太准确,因为大部分.h文件之中只有函数或理解为申明,并没有实现函数的具体过程)
3.使用DLL给编程带来的好处:
随着软件业的不断发展,程序员需要面对的大型、超大型的项目越来越多。使用DLL可以大大方便这些超大型项目的开发工作,简化项目管理。
比如我们可以按照功能将一个大型项目分解成多个部分,把参加整个项目的人员也分成多个项目组,然后让每个项目组完成其中的一部分功能,多项目组同时开发,完成各个功能之后我们只需要将这些DLL链接起来即可。这样做可以有效加快软件编写的进度。
DLL的编写与具体的编程语言以及编辑器没有关系,只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如使用Visual C++编写的DLL,在任何开发环境中都能被调用,不在乎其是Visual Basic、Delphi或者其他的开发环境。
DLL还有一个非常好的特点就是它有助于共享数据和资源。如果多个应用程序需要访问同一个功能,我们可以先将实现该功能的函数写到一个DLL中,这样机器上只需要有一份该DLL就可以了,所有需要该功能的应用程序只需链接该DLL即可调用其中的函数,这样就节省了磁盘空间。在使用时,如果多个应用程序需要同时使用该DLL,那么只需要将该DLL读入内存一次,所有需要使用该DLL的应用程序就可以共享该DLL所在内存页面,从而达到节省内存的目的。
(以上内容摘自Visual C++程序设计与项目实践.安金梁 238页)
4.静态链接库:
静态链接库在编写时函数和数据被编译进一个二进制文件(通常扩展名为.lib),在被主程序使用时,链接接器从静态链接库中复制其中的函数和数据并把它们和主程序一起创建可执行文件(通常,其扩展名为.exe)。所以,静态链接库是在链接时被链接到EXE文件中的,静态链接库本身不需要与可执行文件一起发行,这一点和动态链接库不同。
通过了解,貌似现在开发软件都不怎么经常使用静态链接库了,所以就用Visual C++6.0来做一个示范:
(1)在Visual C++6.0 中新建一个名为“StaticLibTest”的静态链接库程序:

(2)把这两个选项勾选上:

注:√预编译的头文件 - 生成了默认的
这些文件,StdAfx的意思是 Standard Application Frame Extend。StdAfx没有函数库,只是定义了一些参数,使得编译出来的程序能在相应的环境下运行。
√MFC支持 - 是想用MFC集成的诸如 AfxMessageBox 这样的函数来反馈信息。
(3)分别添加 “StaticLibTest.cpp” 源文件和 “StatciLibTest.h” 头文件到工程中并添加以下代码:
// 头文件 StaticLibTest.h 中的代码: #ifndef __STATIC_LIB_H__ #define __STATIC_LIB_H__ extern "C" void StaFunc(); #endif
// 源文件 StaticLibTest.cpp 中的代码:
#include "StdAfx.h"
#include "StaticLibTest.h"
void StaFunc()
{
AfxMessageBox("成功调用静态链接库中的函数!");
}
按下快捷键F7,工程 StaticLibTest 就会在目录下生成对应的静态链接库文件 StaticLibTest.lib。该文件位于“Debug”或“Release”目录中。
前面已经交代过,静态链接库和动态链接库是不能直接被运行的,必须通过其他程序的调用,所以我们再来写一个 MFC 基本对话框应用程序 MasterProgram 来调用静态链接库之中的函数。
(4)关闭之前的工作空间,新建一个 MFC 基本对话框应用程序 MasterProgram:


之后直接点击完成就好,用默认参数。
(5)双击OK按钮,添加如下代码:
void CMasterProgramDlg::OnOK()
{
// TODO: Add extra validation here
StaFunc(); // 调用静态链接库中的函数
CDialog::OnOK();
}
(6)把静态链接库的相关文件拷贝到 MasterProgram 程序的根目录下并在 MasterProgramDlg.h 中添加代码将其与静态链接库中链接在一起:
拷贝到工程的根目录下然后加入以下代码:
#include "StaticLibTest.h" #pragma comment(lib,"staticLibTest.lib")
(7)编译并验证:

完美。
5.动态链接库的编写方法
用VC++创建的动态链接库通常包含两个文件,一个 .lib 格式的文件和一个 .dll 格式的文件。这个 .lib 格式的文件称为引入库文件,与静态链接库中的 .lib 文件不同。引入库文件包含 DLL 到处的函数和变量的符号名,动态链接库中的实际函数和数据则包含在 .dll 文件格式的文件中。在主程序使用隐式加载方式链接动态链接库时,只需将动态链接库的引入库文件与主程序进行链接即可,而动态链接库中的函数代码和数据并不复制到可执行文件中,只有在可执行程序运行时,主程序才去加载所需要的额动态链接库,将该 DLL 映射到地址空间中,然后访问 DLL 中到处的函数和数据。所以,在发布主程序时,除了发布.exe 格式的可执行文件还需要同时发布主程序需要调用的.dll 格式的文件。
在这里我就只简单的讨论一下 MFC DLL 的调用问题吧:(个人感觉显示加载才是写项目的王道,所以就只测试一下显示加载的方法)
(1)在 Visual C++ 6.0 中新建一个名为 “MFCDLL”的 MFC DLL 程序:

(2)点击 OK 按钮,然后进入“MFC 应用程序向导” 对话框:

这里出现了几个选项可以说明一下:
● 动态链接库和 MFC 静态链接库:
使用 MFC 静态链接库的常规 DLL 在发布时只需提供我们编写的 DLL ,而且在有 MFC 类库的机器上生成之后,就可以在没有 MFC 类库的机器上使用了。
● 动态链接库使用共享 MFC DLL:
使用这个方法创建的 DLL 比上面的一种方法创建的文件要小上一些,占用的磁盘空间和内存空间都会小。但是此方法不能在没有 MFC 类库的机器上不能使用。
● MFC 扩展 DLL 使用共享:
MFC 扩展 DLL 也使用共享MFC,所以在没有 MFC 的机器上无法使用。
“扩展 DLL”和“常规 DLL”的区别是牵着还能导出 MFC 类。
● 自动:(自动化)
选择是否支持自动化技术,自动化技术允许用户在一个应用程序中操纵另外一个应用程序或组件。例如,我们可以在应用程序中利用 Microsoft Word 或 Microsoft Excel 提供的工具,而这种使用对用户而言是透明的。
● 套接字:(Windows Sockets)
选择是否支持 Windows Sockets ,选择此项目应用程序将会自动添加一些能在 TCP/IP 网络上进行通信的功能。
这里就按图这样选择好了,其他都默认,直接按完成点击 OK 创建默认工程。
(3)类似于静态链接库那样的,建立一个“MFCDLLOutPut.h” 的头文件和“MFCDLLOutPut.cpp” 的源文件并添加代码:

// MFCDLLOutPut.h 中的代码:
#ifndef __MFCDLL__FUNCTION__DEFINE__H__
#define __MFCDLL__FUNCTION__DEFINE__H__
void MFCfunc()
{
AfxMessageBox("MFCDLL调用成功!");7 #endif
注:还没有完成这个,先发表吧...
关于DLL的学习的更多相关文章
- DLL编程学习
原文出处:http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博 ...
- Delphi之DLL知识学习5---在Delphi应用程序中使用DLL
首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...
- Delphi之DLL知识学习4---创建DLL
下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...
- Delphi之DLL知识学习3---为什么要使用DLL
使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...
- Delphi之DLL知识学习2---静态链接和动态链接
静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...
- Delphi之DLL知识学习1---什么是DLL
DLL(动态链接库)是程序模块,它包括代码.数据或资源,能够被其他的Windows 应用程序共享.DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以 ...
- MFC下的DLL编程学习
1.DLL库与LIB库对比: 静态链接库Lib(Static Link Library),是在编译的链接阶段将库函数嵌入到应用程序的内部.如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造 ...
- DLL劫持学习及复现
0x01 dll简介 在Windows系统中,为了节省内存和实现代码重用,微软在Windows操作系统中实现了一种共享函数库的方式.这就是DLL(Dynamic Link Library),即动态链接 ...
- C# 爬虫DLL文件 学习网站
http://blog.csdn.net/u013063099/article/details/73201649?locationNum=15&fps=1 http://www.cnblogs ...
随机推荐
- 使SSH不用输入密码
1. 自动ssh/scp方法== A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux 在A上运 ...
- 2017了,回家前 "年末" 分享:下雨,飘雪,红包雨,碰撞球,自定义View
(本博客为原创:http://www.cnblogs.com/linguanh/) 目录: 效果展示 感想 代码拆解 开源地址 效果展示 有没有兴趣继续看下去,直接看下"颜值"是第 ...
- 三分钟解读springmvc依赖
长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套用,项目做过几个,但框架的内涵却没有把握.小编打算今天从SpringMVC的依赖分析做起,一步步进行 ...
- ES2:ElasticSearch 集群配置
ElasticSearch共有两个配置文件,都位于config目录下,分别是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 用来配置Elastic ...
- redis安装-单机版
环境准备 因为redis使用c语言开发的,如果要运行在linux上,需要gcc-c++的环境.那么我们就要先看一下是否安装了gcc-c++如果没有的话,需要在虚拟机上安装gcc-c++环境(友情提示, ...
- 动态样式语言—LESS
博客原文地址:Claiyre的个人博客 https://claiyre.github.io/ 博客园地址:http://www.cnblogs.com/nuannuan7362/ 如需转载,请在文章开 ...
- phpcms如何做企业站--> 替换首页最初操作
首先用一个静态首页的模板,通过cms进行替换做成一个有后台的 首页的替换流程首先要先把静态网页做出来,拿这个页面去替换 页面所有的文件都在这,做静态页面的文件 现在要做的是把这些文件复制一下拿到php ...
- Angular企业级开发(7)-MVC之控制器
1.MVC中的控制器 AngularJS的控制器主要为了把模型和视图连接在一起.大多数业务逻辑操作都会放在视图对应的控制器中.当然如果我们能够把业务逻辑放到后端的REST服务中,就可以开发轻量级Ang ...
- Ajax异步获取html数据中包含js方法无效的解决方法
页面上使用js写了一个获取后台数据的方法 function data() { var tab = $("#dic") $.ajax({ url: '../demo.ashx?met ...
- 深度神经网络(DNN)模型与前向传播算法
深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础,而要理解DNN,首先我们要理解DNN模型,下面我们就对DNN的模型与前向传播算法做一个总结. 1. 从感知机 ...