dll目的是软件共享和重用

注意:

1.dll函数创建的任何对象都为调用线程或进程所拥有,dll绝对不会拥有任何对象。

构建dll

编译器把源文件生成obj文件,链接器把obj文件合成,生成dll文件(包含二进制代码和全局/静态变量)。如果有导出函数,还生成lib文件(只列出函数和变量的符号名)。

构建exe

编译器把源文件生成obj文件,链接器把obj文件合成,并使用lib文件,解析导出函数或变量的引用,生成可执行文件exe(保护可执行文件的二进制代码和全局静态变量,还有一个导入段(列出每个dll名称、函数和变量的符号名))。

运行可执行程序

1.进程创建虚拟地址空间

2.把可执行程序映射到进程的地址空间

3.检查可执行程序的导入段

4.把所有的dll映射到进程的地址空间。

extern C 告诉编译器不要对变量名或函数名进行改编。混用c和c++编程,要用extern C

_stdcall 等价于 winapi 调用约束,会改编函数名。

为了不改编函数名,使用.def文件,添加 EXPORTS段

lib是编译时用到的,dll是运行时用到的。
lib记录了dll中函数的入口和位置,dll中是函数的具体内容;应用程序使用LIB文件链接到DLL文件

隐性调用:编译程序时需要头文件、lib文件,运行时需要DLL文件,并且运行过程中DLL文件一直被占用。 一般使用隐性调用,在属性->linker->input->additional dependencies 添加.lib 文件

显性调用:编译时什么都不需要,在需要使用DLL中的函数时,通过LoadLibrary()和GetProcAdress()这两个API调用。
只需要一个DLL文件即可,而且在需要使用的时候DLL才被占用,使用完毕即解除占用(FreeLibrary)。

LoadLibrary():载入指定的动态链接库,并将它映射到当前进程使用的地址空间

GetProcAdress:检索指定的动态链接库(DLL)中的输出函数地址

FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);

应该知道你要的函数的类型是什么,可以用typedef的方法定义函数类型,然后定义一个这种类型的变量,你得到地址后,将地址的类型转换并存到那个变量中就行了

HMODULE hModule=GetModuleHandle("kernel32.dll");

if (hModule)
  {
  typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD);
  LPFNREGISTER lpfnRegister;
  lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");
  if (lpfnRegister)
  {
  (*lpfnRegister)(NULL,1L);
  }
  }

_declspec是一种扩展属性的定义                                                                                                          _declspec(dllimport)   是说这个函数是从别的DLL导入。我要用。      不使用__declspec(dllimport)也能正确编译代码                 
_declspec(dllexport)   是说这个函数要从本DLL导出。我要给别人用。  等价于DLL需要提供.def文件  两者互斥,只能2选1。 def文件只能用来导出函数,不能用于导出整个类。导出C++类,必须用__declspec(dllexport)   其替代宏AFX_EXT_CLASS

.def  文件格式
; 项目名.def : 声明 DLL 的模块参数。 分号;后的文本内容行为注释
LIBRARY      "项目名"
EXPORTS
函数名1 @1
函数名2 @2
……
函数名n @n                                                                                                                           ;

如果希望用MFC(C++)编写的规则DLL中的函数,也能够被非MFC程序来调用,需要为函数声明指定extern "C"  如 extern "C" __declspec(dllexport)

默认情况下VC使用的是__cdecl的函数调用方式,如果产生的dll只会给C/C++程序使用,那么就没必要定义为__stdcall调用方式

判断dll是否映射到进程的地址空间的函数:getmodulehandle,如果传入参数为null ,则返回的是当前可执行程序的句柄。

获取正在运行的可执行文件的路径的函数:getmodulefilename。

导出变量

DLL中导出全局变量的方法

1. 第一种是用__declspec(dllexport)进行导出声明 如 extern __declspec(dllexport) int  dllinum;

2.第二种用模块定义文件(.def)

EXPORTS
        dllinum DATA

全局变量的导入使用 方法

在其他dll或者exe中,导入该变量:

一种方法是extern int dllinum ;但该声明所 入的并不是DLL中全局变量本身,而是其地址 ,应用程序必须通过强制指针转换来使用DLL中的全局变量,要使用 *(int *)dllinum 来使用该变量,如 *(int *)dllinum = 1;

第二种方法用_declspec(dllimport)导入

extern int _declspec(dllimport) dllinum ;  如 dllinum  = 1;

windows dll 学习相关推荐

  1. Windows异常学习笔记(五)—— 未处理异常

    Windows异常学习笔记(五)-- 未处理异常 要点回顾 最后一道防线 实验一:理解最后一道防线 实验二:新线程的最后一道防线 总结 UnhandledExceptionFilter 实验三:理解U ...

  2. Windows异常学习笔记(一)—— CPU异常记录模拟异常记录

    Windows异常学习笔记(一)-- CPU异常记录 基础知识 异常的分类 CPU异常 分析中断处理函数 _KiTrap00 分析 CommonDispatchException 总结 软件模拟异常 ...

  3. Windows APC学习笔记(二)—— 挂入过程执行过程

    Windows APC学习笔记(二)-- 挂入过程&执行过程 基础知识 挂入过程 KeInitializeApc ApcStateIndex KiInsertQueueApc Alertabl ...

  4. Windows系统调用学习笔记(二)—— 3环进0环

    Windows系统调用学习笔记(二)-- 3环进0环 要点回顾 基本概念 _KUSER_SHARED_DATA 0x7FFE0300 实验:判断CPU是否支持快速调用 第一步:修改EAX=1 第二步: ...

  5. Windows系统调用学习笔记(一)—— API函数调用过程

    Windows系统调用学习笔记(一)-- API函数调用过程 Windows API 实验1:分析ReadProcessMemory 第一步:定位函数 第二步:开始分析 总结 实验2:分析NtRead ...

  6. (翻译)31天Windows Phone学习-1-项目模板

    今天在在外文网站Google关于Windows Phone 7的学习资料,无疑间Google到了Jeff Blankenburg的 31 Days of Windows Phone这个系列,感觉写的比 ...

  7. php shellcode,Windows Shellcode学习笔记

    0x00 前言 Windows Shellcode学习笔记--通过VisualStudio生成shellcode,shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload). 在渗 ...

  8. 超详细配置教程,搭建 Windows 深度学习环境

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 选自 | towardsdatascience 作者 | Ahina ...

  9. Windows异常学习笔记(四)—— 编译器扩展SEH

    Windows异常学习笔记(四)-- 编译器扩展SEH 要点回顾 编译器支持的SEH 过滤表达式 实验一:理解_try_except 实验二:_try_except 嵌套 拓展SEH结构体 scope ...

  10. Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发

    Windows异常学习笔记(二)-- 内核异常处理流程&用户异常分发 用户层与内核层异常 内核异常 分析 KiDispatchException 分析 RtlDispatchException ...

最新文章

  1. 封装、继承、多态、访问符,范围修饰符
  2. javascript中的for循环
  3. JSON入门之二:org.json的基本用法
  4. python输入字符串str_python字符串(str)
  5. GitHub进一步了解
  6. idea javafx添加maven_JavaFX让UI更美观CSS样式
  7. Vue项目部署遇到的问题及解决方案
  8. Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数
  9. 2021-06-21>字体样式风格font
  10. Android Studio 下载教程
  11. 基于java的小型超市管理系统系统(含源文件)
  12. 趋势线与123法则应用图解,很多大佬偷偷在用
  13. esp8266连接阿里云 (课程设计 附源码)
  14. 如何培养孩子一年读100本书
  15. EOS区块链技术开发(一)环境搭建
  16. Web前端--HTML+CSS+JavaScript响应式网络科技网页设计
  17. 《iPad开发从入门到精通》——6.6节系统设置
  18. Python+Eclipse配置`PyDev`完整教程
  19. win10系统的点评
  20. 如何查看wsdl文档

热门文章

  1. 结对编程-四则运算(挑战出题)
  2. 垂直的SeekBar:VerticalSeekBar
  3. Java数据结构与算法(3) - ch04栈(栈和转置)
  4. java之模块学习-JAVA的IO流
  5. 基于java的安卓app_Android应用的开发(基于Android 8)遇到的问题
  6. 最大弹窗_你不在意的小弹窗,为什么总是出现问题?
  7. C# List集合排序、去重方法小结
  8. PHP 模拟库存出库商品
  9. Win10 技巧:让任务栏时间显示 “秒”
  10. Layer动态设置每一行的背景色