016_《Delphi源代码分析》

《Delphi源代码分析》

Delphi 教程 系列书籍 (016) Delphi源代码分析》 网友(邦)整理 EMail: shuaihj@163.com

下载地址:


Part1



Part2



 




 

  • 作者: 周爱民 [作译者介绍]
  • 出版社:电子工业出版社
  • ISBN:7121003031
  • 上架时间:2004-10-13
  • 出版日期:2004 年9月
  • 开本:16开
  • 页码:350
  • 版次:1-1

内容简介

本书通过对Delphi内核(RTL)源代码进行分析,深入阐述了Delphi内核(RTL)的原理及其实现。全书从Nico Bendlin编写的著名最小化内核示例程序MiniDExe讲起,基于MiniDExe分析Delphi在编译器一级的技术内幕,带领读者一窥Delphi的核心。随后作者基于这个内核逐层地包装代码,将Delphi的各种功能的具体实现一一展现,通过列出关键性代码并进行系统性分析的方式,全面分析对象结构、VCL和COM等在源代码中的实现。全书内容详实,阐述精辟、深入,主要议题包括:Delphi的编译器在Windows、Delphi RTL和用户代码之间的交互;Delphi RTL内核代码的完整实现;与Delphi内核相关的操作系统机制;初始(入口)代码、模块、内存、线程、资源、异常处理机制等。

本书是一本不可多得的高端技术图书,适合中、高级Delphi开发人员研读。

目录

序 i

前言 I

第一部分 Delphi内核深入剖析(I) 1

第1章 最小化Delphi内核 3

1.1 MiniDExe如何实现内核最小化 3

1.1.1 MiniDExe中的System.pas单元 4

1.1.2 MiniDExe中的SysInit.pas单元 5

1.1.3 MiniDExe中的项目文件MiniDExe.dpr 6

1.2 一些其他的内核优化 6

1.3 为什么要研究最小化内核 7

第2章 基本数据类型的实现 9

2.1 基本数据类型 9

2.2 变量与常量 11

2.2.1 全局变量与局部变量 11

2.2.2 动态分配的内存 12

2.2.3 换一个方式来理解 13

2.2.4 常量 14

2.3 数据结构的实现 16

2.3.1 简单类型 16

2.3.2 字符串 16

2.3.3 构造类型 26

2.3.4 指针类型 28

2.3.5 过程类型 28

2.4 数据结构相关的例程 29

2.4.1 标准Pascal的内置例程 30

2.4.2 字符串操作例程 31

2.5 变量的类型检测与强制转换 47

2.6 引用-计数-写复制与类型信息 48

2.6.1 引用计数与增加引用 48

2.6.2 "增加引用"何时发生 49

2.6.3 增加引用的操作是依赖类型信息来实现的 51

2.6.4 写复制与值参数的备份 53

第3章 BASM(Borland汇编语言)精要 55

3.1 BASM概念简要 55

3.2 表达式的类别与类型 56

3.3 数据定义和数据类型强制转换 57

3.4 例程入口参数及调用约定 61

3.5 例程和API的调用与流程控制 62

3.6 完全汇编例程与内嵌汇编例程 65

3.7 汇编例程中的返回值约定 66

3.8 其他 67

第4章 初始化与结束化过程 71

4.1 变量的初始化与结束化 71

4.1.1 初始化的必要性 72

4.1.2 如何初始化 73

4.1.3 如何结束化 74

4.2 例程的初始化与结束化 76

4.3 单元初始化与结束化 77

4.4 模块初始化与结束化 79

4.4.1 模块入口代码 79

4.4.2 编译器决定的程序执行流程 80

第5章 面向Windows开发的基本实现 83

5.1 Win32应用程序:EXE 83

5.1.1 适应Win32应用程序的最简化内核 83

5.1.2 初始化例程_InitExe() 85

5.1.3 内部模块表管理例程 86

5.1.4 .EXE启动例程_StartExe() 87

5.1.5 应用程序的结束化控制 88

5.2 32位的DOS:控制台应用程序 91

5.2.1 控制台应用程序的模块入口代码 91

5.2.2 控制台应用程序的最小化实现 92

5.2.3 控制台应用程序的Delphi实现 93

5.2.4 文件操作例程与控制台应用程序 94

5.2.5 控制台的开启与关闭 97

5.2.6 CRT单元与Input、Output的重载 98

5.3 动态链接库:DLL 99

5.3.1 丢失的DllMain() 99

5.3.2 _InitLib()例程 101

5.3.3 _StartLib()例程 101

5.3.4 .DLL的结束化过程 102

5.3.5 DllProc与DllMain()的不同 105

5.3.6 动态链接库的内核最小化 106

5.4 Delphi的动态链接库:包 108

5.4.1 包的主要规则 108

5.4.2 Delphi中的包与普通DLL的区别 110

5.4.3 包的DllMain() 111

5.4.4 包的载入例程LoadPackage() 112

5.4.5 真正的初始化例程InitializePackage() 112

5.4.6 包的卸载例程UnloadPackage() 115

5.4.7 包的基本输出例程 115

5.4.8 内部例程_PackageLoad()与_PackageUnload() 116

5.4.9 包的内核最小化 117

5.5 其他 118

5.5.1 初始化上下文中OuterContext域的使用 118

5.5.2 入口代码中的堆栈使用深入分析(内存现场) 119

5.5.3 再论入口代码 123

第6章 Delphi的积木艺术(PE) 127

6.1 PE文件结构概要 127

6.1.1 文件头 129

6.1.2 节表 131

6.1.3 节 132

6.1.4 PE文件与内存映射 134

6.1.5 有关相对虚地址的计算 138

6.2 Delphi的PE文件头中一些重要的域 142

6.3 Delphi的PE文件中一些重要的节 144

6.3.1 线程局部存储(.tls和.rdata) 144

6.3.2 资源节(.rsrc) 145

6.3.3 导入、导出表(.idata和.edata) 146

6.3.4 数据节与代码节(DATA、BSS和CODE) 154

6.3.5 重定位节(.reloc) 157

6.4 3.5K的秘密 159

6.4.1 Delphi的PE文件头部 159

6.4.2 Delphi的PE文件的节及其默认对齐 160

6.4.3 还可能更小吗 160

6.4.4 3.5K代码的内存映射 161

6.5 入口点 162

第二部分 Delphi内核深入剖析(II) 167

第7章 Delphi的内存管理器 169

7.1 Delphi的内存管理器实现框架 169

7.2 内存页管理 171

7.3 堆 172

7.4 MemoryManager及相关例程 172

7.5 GetMem.inc中的重要例程 174

7.5.1 堆块及其管理例程 175

7.5.2 虚地址空间(Address space)管理 178

7.5.3 已提交的内存空间(Committed space)管理 179

7.5.4 用户调用例程(actually calls)的实现 180

7.5.5 初始化、结束化与其他辅助例程 194

7.6 遍历全部内存块 195

7.7 共享内存管理器 197

7.8 第三方内存管理器 200

7.9 小结 201

第8章 错误和异常 203

8.1 错误 203

8.2 断言 206

8.3 Windows与Delphi中的异常处理机制概要 209

8.4 编译器对异常处理机制的实现 212

8.4.1 最小化内核的启示 212

8.4.2 从操作系统的角度来理解编译器行为 216

8.4.3 try..finally/except..end语法关键字与内部例程 219

8.5 基本(except型)异常处理 221

8.5.1 异常触发(Raise) 221

8.5.2 多层(嵌套)的异常处理 222

8.5.3 异常展开(Unwind) 223

8.5.4 异常响应(Notify) 227

8.5.5 顶层异常处理 229

8.6 使用面向对象技术的异常类 233

8.6.1 异常列表、RaiseFrame与ExceptionRecord 233

8.6.2 未知异常映射:ExceptObjProc 235

8.6.3 不使用SysUtils.pas单元的应用程序 236

8.6.4 _RaiseExcept()、_RaiseAgain()与_DoneExcept()例程 238

8.6.5 异常对象 241

8.6.6 异常类型检测的依赖性问题 247

第9章 多线程的实现及调度 251

9.1 操作系统的进程与线程 252

9.1.1 线程的启动过程 253

9.1.2 主线程与用户线程启动过程的比较 255

9.1.3 线程有哪些独立元素 256

9.2 操作系统的线程调度概要 257

9.3 基本的多线程应用 258

9.4 线程变量(线程局部存储) 261

9.4.1 线程局部存储(TLS)的实质 262

9.4.2 编译器的准备工作 263

9.4.3 静态TLS:EXE模块中的TLS 265

9.4.4 动态TLS:DLL模块中的TLS 266

9.5 再论FS段 268

9.6 线程类(TThread) 272

9.6.1 线程执行体(Execute) 275

9.6.2 线程与主线程的同步(Synchronize) 277

9.6.3 控制台应用的多线程同步(第三方的WakeMainThread例程) 287

9.6.4 线程中止和结束(Terminate) 292

9.7 线程同步对象 297

9.7.1 线程同步方法 298

9.7.2 Delphi中的线程同步类 306

9.7.3 线程对象的WaitFor()方法 311

9.8 多线程环境下的内存管理器 312

第10章 资源的管理和使用 315

10.1 资源字符串 315

10.1.1 隐含的调用:LoadResString()例程 315

10.1.2 _InitResStrings()例程 317

10.1.3 _InitResStringImports()例程 319

10.1.4 _InitImports()例程 320

10.2 Delphi编译的PE文件的默认资源 322

10.2.1 PACKAGEINFO资源 323

10.2.2 PACKAGEOPTIONS资源 324

10.2.3 DVCLAL资源 326

10.2.4 DESCRIPTION资源 327

10.3 其他 327

第11章 突破Delphi在应用开发上的限制 329

11.1 开发DOS保护模式程序 329

11.2 开发Windows9x上的驱动程序 335

11.2.1 Delphi编译的.OBJ文件 335

11.2.2 第三方的链接器处理Delphi的.OBJ文件的问题 336

11.2.3 在Delphi中编写VxD驱动程序代码 337

11.2.4 链接目标文件并输出VxD驱动程序 338

11.3 开发WinNT/2000上的驱动程序 339

11.4 其他 342

术语表 343

参考书目 347

时间: 2024-11-03 13:29:52

016_《Delphi源代码分析》的相关文章

FreeBSD 5.0中强制访问控制机制的使用与源代码分析(2)

本文主要讲述FreeBSD 5.0操作系统中新增的重要安全机制,即强制访问控制机制(MAC)的使用与源代码分析,主要包括强制访问控制框架及多级安全(MLS)策略两部分内容.这一部分较系统地对MAC框架及MLS策略的源代码进行分析. 2 MAC框架与MLS策略源代码分析 与本文相关的源代码文件主要有两个,即 /usr/src/sys/kern/kern_mac.c 和 /usr/src/sys/security/mac_mls/mac_mls.c .另外还有一些头文件如mac.h.mac_poli

FreeBSD 5.0中强制访问控制机制的使用与源代码分析(1)

本文主要讲述FreeBSD 5.0操作系统中新增的重要安全机制,即强制访问控制机制(MAC)的使用与源代码分析,主要包括强制访问控制框架及多级安全(MLS)策略两部分内容.这一部分讲述要将MAC框架与MLS策略用起来,应该做的一些工作,以及如何有效使用它们的问题. 强制访问控制(英文缩写MAC)是实现操作系统安全的一个重要的方法,现在几乎所有的安全操作系统都采用强制访问控制作为其核心安全机制之一.强制访问控制是对操作系统的各种客体(如文件.socket.系统FIFO.SCD.IPC等)进行细粒度

slab内存管理源代码分析

学习计算机原理,最好是实践或看高手写的源代码,在一定程度上就不再会感到原理的抽象.关于slab一些原理资料,可以在这里下载或到网站有更多的信息和资料.Slab内存管理机制已被广泛使用,要找到使用slab管理内存的开源代码也不难,如一些OS内核中的内存管理.既然要分析理解slab,最好还是选择复杂度和代码量都不要太大的,在这里我选取了glib-2.12.9的gslice.c实现的slab机制相关代码作为分析对象.注意Glib库是针对用户级的而非OS内核级别的. gslice.c中实现了三种内存分配

Spring源代码分析-XmlBeanFactory导读

源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的,但当你能够看 明白的时候,相信快乐也会随之而来,为了减少痛苦,更快的带来快乐,在这里希望通过 这篇文章对觉得困难的朋友有一个帮助. 首先来打开该类的代码,我们将看到如下代码: Java代码 public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanD

Glibc 的malloc源代码分析

Glibc 的 malloc 源代码分析 有人写了一个测试程序 #include <stdlib.h> #include <unistd.h> #include <string.h> #include <malloc.h> main() {   int alloc_time = 20000;   char* a[alloc_time];   char* b[alloc_time]; for(int j=0; j<5; j++) {   for(int

Android ArrayMap源代码分析_Android

      分析源码之前先来介绍一下ArrayMap的存储结构,ArrayMap数据的存储不同于HashMap和SparseArray. Java提供了HashMap,但是HashMap对于手机端而言,对空间的利用太大,所以Android提供了SparseArray和ArrayMap.二者都是基于二分查找,所以数据量大的时候,最坏效率会比HashMap慢很多.因此建议数量在千以内比较合适.  一.SparseArray SparseArray对应的key只能是int类型,它不会对key进行装箱操

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析_Android

        在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码.细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间通信呢?这就是本文要介绍的Android系统应用程序框架层的用Java语言来实现的Binder接口了.        熟悉Android系统

Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析_Android

     在上一篇文章中,我们分析了Android系统进程间通信机制Binder中的Server在启动过程使用Service Manager的addService接口把自己添加到Service Manager守护过程中接受管理.在这一篇文章中,我们将深入到Binder驱动程序源代码去分析Client是如何通过Service Manager的getService接口中来获得Server远程接口的.Client只有获得了Server的远程接口之后,才能进一步调用Server提供的服务.       

【SpringMVC框架】前端控制器源代码分析

前端控制器源代码分析 虽然前面讲了一些springmvc的入门程序和配置文件中映射器和适配器的配置,但是我们作为编程人员,了解框架的部分源码还是有必要的,比如前端控制器,它是如何通过Servlet的web.xml配置文件实现拦截并跳转至DispatcherServlet的呢?下面我们详细探讨 众多周知我们的入门程序的web.xml是这么配置的 <?xml version="1.0" encoding="UTF-8"?> <web-app versi