书籍详情
Delphi源代码分析
作者:周爱民著
出版社:电子工业出版社
出版时间:2004-09-01
ISBN:9787121003035
定价:¥40.00
购买这本书可以去
内容简介
本书通过对Delphi内核(RTL)源代码进行分析,深入阐述了Delphi内核(RTL)的原理及其实现。全书从Nico Bendlin编写的著名最小化内核示例程序MiniDExe讲起,基于MiniDExe分析Delphi在编译器一级的技术内幕,带领读者一窥Delphi的核心。随后作者基于这个内核逐层地包装代码,将Delphi的各种功能的具体实现一一展现,通过列出关键性代码并进行系统性分析的方式,全面分析对象结构、VCL和COM等在源代码中的实现。全书内容详实,阐述精辟、深入,主要议题包括:Delphi的编译器在Windows、Delphi RTL和用户代码之间的交互;Delphi RTL内核代码的完整实现;与Delphi内核相关的操作系统机制;初始(入口)代码、模块、内存、线程、资源、异常处理机制等。本书是一本不可多得的高端技术图书,适合中、高级Delphi开发人员研读。
作者简介
周爱民,1999-2000年为AV95的三个核心开发人员之一,顺利完成了该核心层代码编写。2000-2002年完成极光网络数据仓库心中心系统,荣获河南省高新技术产品二等奖。2003年被美国Borland公司授予“Borland Delphi产品专家“称号,同时授予”论坛特别贡献奖“。为惟一同时被授两个将项人人员。2003年11月,受邀参加Borland公司成立20周年举办的“Borland首届开发者大会“,发表题为“利用Delphi实现在Micphi 实现在Microsoft.NET Framework下的开发“演讲。
目录
第一部分 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章 多线程的实现及调度 250
9.1 操作系统的进程与线程 251
9.1.1 线程的启动过程 252
9.1.2 主线程与用户线程启动过程的比较 254
9.1.3 线程有哪些独立元素 255
9.2 操作系统的线程调度概要 256
9.3 基本的多线程应用 257
9.4 线程变量(线程局部存储) 260
9.4.1 线程局部存储(TLS)的实质 261
9.4.2 编译器的准备工作 262
9.4.3 静态TLS:EXE模块中的TLS 265
9.4.4 动态TLS:DLL模块中的TLS 266
9.5 再论FS段 268
9.6 线程类(TThread) 271
9.6.1 线程执行体(Execute) 275
9.6.2 线程与主线程的同步(Synchronize) 277
9.6.3 控制台应用的多线程同步(第三方的WakeMainThread例程) 287
9.6.4 线程中止和结束(Terminate) 291
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
第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章 多线程的实现及调度 250
9.1 操作系统的进程与线程 251
9.1.1 线程的启动过程 252
9.1.2 主线程与用户线程启动过程的比较 254
9.1.3 线程有哪些独立元素 255
9.2 操作系统的线程调度概要 256
9.3 基本的多线程应用 257
9.4 线程变量(线程局部存储) 260
9.4.1 线程局部存储(TLS)的实质 261
9.4.2 编译器的准备工作 262
9.4.3 静态TLS:EXE模块中的TLS 265
9.4.4 动态TLS:DLL模块中的TLS 266
9.5 再论FS段 268
9.6 线程类(TThread) 271
9.6.1 线程执行体(Execute) 275
9.6.2 线程与主线程的同步(Synchronize) 277
9.6.3 控制台应用的多线程同步(第三方的WakeMainThread例程) 287
9.6.4 线程中止和结束(Terminate) 291
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
猜您喜欢