初学DLL,结合教程,总结一下自己的所得,希望对DLL初学者们有所帮助。

动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的。所有的C语言标准库函数都存放在某一函数库中。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。这种方法同只把函数储存在已编译的OBJ文件中相比更有利于代码的重用。但随着Windows这样的多任务环境的出现,函数库的方法显得过于累赘。如果为了完成屏幕输出、消息处理、内存管理、对话框等操作,每个程序都不得不拥有自己的函数,那么Windows程序将变得非常庞大。Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝。动态链接库就是在这种情况下出现的。动态链接库不用重复编译或链接,一旦装入内存,DLL函数可以被系统中的任何正在运行的应用程序软件所使用,而不必再将DLL函数的另一拷贝装入内存。

下面我们一步一步来建立一个DLL。

一、建立一个DLL工程
   新建一个工程,选择Win32 控制台项目(Win32 Console Application),并且在应用程序设置标签(the advanced tab)上,选择DLL和空项目选项。

二、声明导出函数
   这里有两种方法声明导出函数:一种是通过使用__declspec(dllexport),添加到需要导出的函数前,进行声明;另外一种就是通过模块定义文件(Module-Definition File即.DEF)来进行声明。
   第一种方法,建立头文件DLLSample.h,在头文件中,对需要导出的函数进行声明。

#ifndef _DLL_SAMPLE_H
#define _DLL_SAMPLE_H

// 如果定义了C++编译器,那么声明为C链接方式
#ifdef __cplusplus
extern "C" {
#endif

// 通过宏来控制是导入还是导出
#ifdef _DLL_SAMPLE
#define DLL_SAMPLE_API __declspec(dllexport)
#else
#define DLL_SAMPLE_API __declspec(dllimport)
#endif

// 导出/导入函数声明
DLL_SAMPLE_API void TestDLL(int);

#undef DLL_SAMPLE_API

#ifdef __cplusplus
}
#endif

#endif

   这个头文件会分别被DLL和调用DLL的应用程序引入,当被DLL引入时,在DLL中定义_DLL_SAMPLE宏,这样就会在DLL模块中声明函数为导出函数;当被调用DLL的应用程序引入时,就没有定义_DLL_SAMPLE,这样就会声明头文件中的函数为从DLL中的导入函数。 
  
   第二种方法:模块定义文件是一个有着.def文件扩展名的文本文件。它被用于导出一个DLL的函数,和__declspec(dllexport)很相似,但是.def文件并不是Microsoft定义的。一个.def文件中只有两个必需的部分:LIBRARY 和 EXPORTS。

LIBRARY DLLSample
DESCRIPTION "my simple DLL"
EXPORTS
        TestDLL @1  ;@1表示这是第一个导出函数
   第一行,''LIBRARY''是一个必需的部分。它告诉链接器(linker)如何命名你的DLL。下面被标识为''DESCRIPTION''的部分并不是必需的。该语句将字符串写入 .rdata 节,它告诉人们谁可能使用这个DLL,这个DLL做什么或它为了什么(存在)。再下面的部分标识为''EXPORTS''是另一个必需的部分;这个部分使得该函数可以被其它应用程序访问到并且它创建一个导入库。当你生成这个项目时,不仅是一个.dll文件被创建,而且一个文件扩展名为.lib的导出库也被创建了。除了前面的部分以外,这里还有其它四个部分标识为:NAME, STACKSIZE, SECTIONS, 和 VERSION。另外,一个分号(;)开始一个注解,如同''//''在C++中一样。定义了这个文件之后,头文件中的__declspec(dllexport)就不需要声明了。

三、编写DllMain函数和导出函数
   DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。

#include "stdafx.h"
#define _DLL_SAMPLE

#ifndef _DLL_SAMPLE_H
#include "DLLSample.h"
#endif

#include "stdio.h"

//APIENTRY声明DLL函数入口点
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
 switch (ul_reason_for_call)
 {
  case DLL_PROCESS_ATTACH:
  case DLL_THREAD_ATTACH:
  case DLL_THREAD_DETACH:
  case DLL_PROCESS_DETACH:
   break;
 }
 return TRUE;
}

void TestDLL(int arg)
{
  printf("DLL output arg %d\n", arg);
}    如果程序员没有为DLL模块编写一个DLLMain函数,系统会从其它运行库中引入一个不做任何操作的缺省DLLMain函数版本。在单个线程启动和终止时,DLLMain函数也被调用。
   然后,F7编译,就得到一个DLL了。

DLL入门浅析(1)——如何建立DLL相关推荐

  1. DLL入门浅析(2)——如何使用DLL

    上文我简单的介绍了如何建立一个简单DLL,下面再我简单的介绍一下如何使用一个DLL.当一个DLL被生成后,它创建了一个.dll文件和一个.lib文件:这两个都是你需要的.要使用DLL,就需要载入这个D ...

  2. DLL入门浅析(5)——使用DLL在进程间共享数据

    在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间:而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所 ...

  3. DLL入门浅析(4)——从DLL中导出类

    前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小异,废话就不多说了,下面给个简单例子示范一下,也就不多做解释了. DLL头文件: #ifndef _DLL_SAMPLE_H #de ...

  4. DLL入门浅析(3)——从DLL中导出变量

    前面介绍了怎么从DLL中导出函数,下面我们来看一下如何从DLL中导出变量来. 声明为导出变量时,同样有两种方法:    第一种是用__declspec进行导出声明 #ifndef _DLL_SAMPL ...

  5. Windows动态链接库(dll)浅析 - 2

    Windows动态链接库(dll)浅析 - 2 Windows动态链接库(dll)浅析 - 1 Windows动态链接库(dll)浅析 - 3 5. DLL的编写 5.1 一个简单的dll项目 上面用 ...

  6. 在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

    在IIS7里配置 ISAPI,运行dll程序,总提示下载dll,只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序,设为"true"即可.

  7. C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别

    C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1  LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add F ...

  8. pb调用c语言dll,PB调用C#编写的Dll类库

    在c# 中编写com组件,供PB调用实例 前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意. c#中新建类库 类库类型为通用类库,项目名为AddC ...

  9. c++ dll继续使用然后强制删除dll文件_Windows 10系统安全风险,近300个系统执行文件容易遭受劫持攻击...

    一个简单的VBScript足以让用户获得管理权限并完全绕过Windows 10上的UAC. 在普华永道英国安全研究人员Wietze Beukema的最新报告中,我们了解到将近300个Windows 1 ...

最新文章

  1. 谷歌大脑新研究:强化学习如何学会用声音来观察?
  2. python公共键_Python利用公共键如何对字典列表进行排序详解
  3. leetcode算法题--圆圈中最后剩下的数字
  4. docker容器中安装vim 、telnet、ifconfig, ping命令
  5. 第一章 简单工厂模式
  6. nginx 直接在配置文章中设置日志分割
  7. vue 项目加载顺序_如何提高Vue项目首页的加载速度
  8. 用SonBuddy搭建无线局域网,共享上网。(SONBuddy常见问题,无线组网,共享,上网,笔记本)...
  9. vs2015编译ffmpeg
  10. 【3D文件格式解析】.obj + .mtl
  11. 英伟达实时 3D 设计协作和仿真平台已正式发布
  12. RocketMQ ConsumeQueue 消费队列文件
  13. 2019年管理类MBA/MEM联考英语小作文范文
  14. matlab编程勒让德多项式展开例题解析,第19 勒让德多项式 球函数习题及解答
  15. rk3399pro buildroot SDK编译及烧录
  16. 从事python需要掌握哪些知识和技能_转行从事Python,需要掌握什么技能?
  17. 一文详解什么是RNN(循环神经网络)
  18. Redis个人学习笔记 参考B站视频以及CSDN文档 2万多字 非常全面
  19. 常系数非齐次线性微分方程(两种常见形式)
  20. HBuilderX使用Git

热门文章

  1. 编写Eureka入门案例
  2. 模拟实现顺序表ArrayList2(三级)
  3. 第一章计算机基础知识作业答案,第一章 计算机基础知识.doc第一次作业
  4. java main方法调用非静态方法_java中main函数怎么调用外部非static方法
  5. Bean 在 Spring 中代表什么含义,为什么这样命名?
  6. pip指定包的安装路径
  7. STM32 地址偏移问题及怎么运用
  8. airflow零基础入门
  9. kickstart 安装CentOS GPT分区的完整ks示例
  10. jquery中Live方法不可用,Jquery中Live方法失效