词条 | Windows核心编程精讲 |
释义 | 基本信息作者:(美)Jeffrey Richter Christophe Nasarre 译者:葛子昂 周靖 廖敏 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302184003 出版日期:2008 年9月 开本:16开 页码:770 版次:5-1 编辑推荐权威力作 再度新鲜亮相. 名著名译 彰显经典魅力 中英联动 丰富阅读体验.. 深刻剖析底层实现机理 直击Windows编程精髓 内容简介这是一本经典的windows核心编程指南,从第1版到第5版,引领着数十万程序员走入windows开发阵营,培养了大批精英。 作为windows开发人员的必备参考,本书是为打算理解windows的c和c++程序员精心设计的。第5版全面覆盖windows xp,windows vista和windows server 2008中的170个新增函数和windows特性。书中还讲解了windows系统如何使用这些特性,我们开发的应用程序又如何充分使用这些特性,如何自行创建新的特性。 作译者Jeffrey Richter是Wintellect公司的创始人之一,该公司从事培训、调试和咨询,致力于帮助其他公司以更快的速度开发出更优秀的软件。他著作颇丰,代表作有畅销书CLR viaC#。他还是MSDN Magazine的特约编辑和专栏作家。 目录第ⅰ部分 必备知识 第1章 错误处理 1 1 定义自己的错误代码 1 2 errorshow示例程序 第2章 字符和字符串处理 2 1 字符编码 2 2 ansi字符和unicode字符与字符串数据类型 2 3 windows中的unicode函数和ansi函数 2 4 c运行库中的unicode函数和ansi函数 2 5 c运行库中的安全字符串函数 2 5 1 初识新的安全字符串函数 2 5 2 在处理字符串时如何获得更多控制 2 5 3 windows字符串函数 2 6 为何要用unicode 2 7 推荐的字符和字符串处理方式 2 8 unicode与ansi字符串转换 2 8 1 导出ansi和unicode dll函数 2 8 2 判断文本是ansi还是unicode 第3章 内核对象 3 1 何为内核对象 3 1 1 使用计数 3 1 2 内核对象的安全性 3 2 进程内核对象句柄表 3 2 1 创建一个内核对象 3 2 2 关闭内核对象 3 3 跨进程边界共享内核对象 3 3 1 使用对象句柄继承 3 3 2 改变句柄的标志 3 3 3 为对象命名 3 3 4 终端服务命名空间 3 3 5 专有命名空间 3 3 5 复制对象句柄 第ⅱ部分 工作机制 第4章 进程 4 1 编写第一个windows应用程序 4 1 1 进程实例句柄 4 1 2 进程前一个实例的句柄 4 1 3 进程的命令行 4 1 4 进程的环境变量 4 1 5 进程的关联性 4 1 6 进程的错误模式 4 1 7 进程当前所在的驱动器和目录 4 1 8 进程的当前目录 4 1 9 系统版本 4 2 createprocess函数 4 2 1 pszapplicationname和pszcommandline参数 4 2 2 psaprocess,psathread和binherithandles参数 4 2 3 fdwcreate参数 4 2 4 pvenvironment参数 4 2 5 pszcurdir参数 4 2 6 psistartinfo参数 4 2 7 ppiprocinfo参数 4 3 终止进程 4 3 1 主线程的入口点函数返回 4 3 2 exitprocess函数 4 3 3 terminateprocess函数 4 3 4 当进程中的所有线程终止时 4 3 5 当进程终止运行时 4 4 子进程 4 5 管理员以标准用户权限运行时 4 5 1 自动提升进程的权限 4 5 2 手动提升进程的权限 4 5 3 何为当前权限上下文 4 5 4 枚举系统中正在运行的进程 4 5 5 process information示例程序 第5章 作业 5 1 对作业中的进程施加限制 5 2 将进程放入作业中 5 3 终止作业中的所有线程查询作业统计信息 5 4 作业通知 5 6 job lab示例程序 第6章 线程基础 6 1 何时创建线程 6 2 何时不应该创建线程 6 3 编写第一个线程函数 6 4 createthread函数 6 4 1 psa参数 6 4 2 cbstacksize参数 6 4 3 pfnstartaddr和pvparam参数 6 4 4 dwcreateflags 6 4 5 pdwthreadid7 6 5 终止运行线程 6 5 1 线程函数返回 6 5 2 exitthread函数 6 5 3 terminatethread函数 6 5 4 进程终止运行时 6 5 5 线程终止运行时 6 6 线程内幕 6 7 c/c++运行库注意事项 6 7 1 用_beginthreadex而不要用createthread创建线程 6 7 2 绝对不应该调用的c/c++运行库函数 6 8 了解自己的身份 6 8 1 将伪句柄转换为真正的句柄 第7章 线程调度、优先级和关联性 7 1 线程的挂起和恢复 7 2 进程的挂起和恢复 7 3 睡眠 7 4 切换到另一个线程 7 5 在超线程cpu上切换到另一个线程 7 6 线程的执行时间 7 7 在实际上下文中谈context结构 7 8 线程优先级 7 9 从抽象角度看优先级 7 10 优先级编程 7 10 1 动态提升线程优先级 7 10 2 为前台进程微调调度程序 7 10 3 调度i/o请求优先级 7 10 4 scheduling lab 示例程序 7 11 关联性 第8章 用户模式下的线程同步 8 1 原子访问:interlocked系列函数 8 2 高速缓存行 8 3 高级线程同步需要避免使用的一种方法 8 4 关键段 8 4 1 关键段:细节 8 4 2 关键段和旋转锁 8 4 3 关键段和错误处理 8 5 slim读/写锁 8 6 条件变量 8 6 1 queue示例程序 8 6 2 在停止线程时的死锁问题 8 6 3 一些有用的窍门和技巧 第9章 用内核对象进行线程同步 9 1 等待函数 9 2 等待成功所引起的副作用 9 3 事件内核对象 9 4 可等待的计时器内核对象 9 4 1 让可等待的计时器添加apc调用 9 4 2 计时器的剩余问题 9 5 信号量内核对象 9 6 互斥量内核对象 9 6 1 遗弃问题 9 6 2 互斥量与关键段的比较 9 6 3 queue示例程序 9 7 线程同步对象速查表 9 8 其他的线程同步函数 9 8 1 异步设备i/o 9 8 2 waitforinputidle函数 9 8 3 msgwaitformultipleobjects(ex)函数 9 8 4 waitfordebugevent函数 9 8 5 signalobjectandwait函数 9 8 6 使用等待链遍历api来检测死锁 第10章 同步设备i/o与异步设备i/o 10 1 打开和关闭设备细看createfile函数 10 2 使用文件设备 10 2 1 取得文件的大小 10 2 2 设置文件指针的位置 10 2 3 设置文件尾 10 3 执行同步设备i/o 10 3 1 将数据刷新至设备 10 3 2 同步i/o的取消 10 4 异步设备i/o基础 10 4 1 overlapped结构 10 4 2 异步设备i/o的注意事项 10 4 3 取消队列中的设备i/o请求 10 5 接收i/o请求完成通知 10 5 1 触发设备内核对象 10 5 2 触发事件内核对象 10 5 3 可提醒i/o 10 5 4 i/o完成端口 10 5 5 模拟已完成的i/o请求 第11章 windows线程池 11 1 情形1:以异步方式调用函数 11 1 1 显式地控制工作项 11 1 2 batch示例程序 11 2 情形2:每隔一段时间调用一个函数 11 3 情形3:在内核对象触发时调用一个函数 11 4 情形4:在异步i/o请求完成时调用一个函数 11 5 回调函数的终止操作 11 5 1 对线程池进行定制 11 5 2 得体地销毁线程池:清理组 第12章 纤程 第ⅲ部分 内存管理 第13章 windows内存体系结构 13 1 进程的虚拟地址空间 13 2 虚拟地址空间的分区 13 2 1 空指针赋值分区 13 2 2 用户模式分区 13 3 地址空间中的区域 13 4 给区域调拨物理存储器 13 5 物理存储器和页交换文件 13 6 页面保护属性 13 6 1 写时复制 13 6 2 一些特殊的访问保护属性标志 13 7 实例分析 13 8 数据对齐的重要性 第14章 探索虚拟内存 14 1 系统信息 14 2 虚拟内存状态 14 3 numa机器中的内存管理 14 4 确定地址空间的状态 14 4 1 vmquery函数 14 4 2 示例程序:虚拟内存映射 第15章 在应用程序中使用虚拟内存 15 1 预订地址空间区域 15 2 给区域调拨物理存储器 15 3 同时预订和调拨物理存储器 15 4 何时调拨物理存储器 15 5 撤销调拨物理存储器及释放区 15 5 1 何时撤销调拨物理存储器 15 5 2 虚拟内存分配示例程序 15 6 改变保护属性 15 7 重置物理存储器的内容 15 8 地址窗口扩展 第16章 线程栈 16 1 c/c++运行库的栈检查函数 16 2 summation示例程序 第17章 内存映射文件 17 1 映射到内存的可执行文件和dll 17 1 1 同一个可执行文件或dll的多个实例不会共享静态数据 17 1 2 在同一个可执行文件或dll的多个实例间共享静态数据 17 1 3 application instances示例程序 17 2 映射到内存的数据文件 17 2 1 方法1:一个文件,一块缓存 17 2 2 方法2:两个文件,一块缓存 17 2 3 方法3:一个文件,两块缓存 17 2 4 方法4:一个文件,零个缓存 17 3 使用内存映射文件 17 3 1 第1步:创建或打开文件内核对象 17 3 2 第2步:创建文件映射内核对象 17 3 3 第3步:将文件的数据映射到进程的地址空间 17 3 4 第4步:从进程的地址空间撤销对文件数据的映射 17 3 5 第5步和第6步:关闭文件映射对象和文件对象 17 6 file reverse示例程序 17 7 用内存映射文件来处理大文件 17 8 内存映射文件和一致性 17 9 给内存映射文件指定基地址 17 10 内存映射文件的实现细节 第18章 堆 18 1 进程的默认堆 18 2 为什么要创建额外的堆 18 2 1 对组件进行保护 18 2 2 更有效的内存管理 18 2 3 使内存访问局部化 18 2 4 避免线程同步的开销 18 2 5 快速释放 18 3 如何创建额外的堆 18 3 1 从堆中分配内存块 18 3 2 调整内存块的大小 18 3 3 获得内存块的大小 18 3 4 释放内存块 18 3 5 销毁堆 18 3 6 在c++中使用堆 18 4 其他堆函数 第ⅳ部分 动态链接库 第19章 dll基础 19 1 dll和进程的地址空间 19 2 纵观全局 19 2 1 构建dll模块 19 2 2 构建可执行模块 19 2 3 运行可执行模块 第20章 dll高级技术 20 1 dll模块的显式载入和符号链接 20 1 1 显式地载入dll模块 20 1 2 显式地卸载dll模块 20 1 3 显式地链接到导出符号 20 2 dll的入口点函数 20 2 1 dll_process_attach通知 20 2 2 dll_process_detach通知 20 2 3 dll_thread_attach通知 20 2 4 dll_thread_detach通知 20 2 5 dllmain的序列化调用 20 2 6 dllmain和c/c++运行库 20 3 延迟载入dll 20 4 函数转发器 20 5 已知的dll 20 6 dll重定向 20 7 模块的基地址重定位 20 8 模块的绑定 第21章 线程局部存储区 21 1 动态tls 21 2 静态tls0 第22章 dll注入和api拦截 22 1 dll注入的一个例子 22 2 使用注册表来注入dll 22 3 使用windows挂钩来注入dll 22 4 使用远程线程来注入dll 22 4 1 inject library示例程序 22 4 2 image walk dll 22 5 使用木马dll来注入dll 22 6 把dll作为调试器来注入 22 7 使用createprocess来注入代码 22 8 api拦截的一个例子9 22 8 1 通过覆盖代码来拦截api0 22 8 2 通过修改模块的导入段来拦截api 22 8 3 last messagebox info示例程序 第ⅴ部分 结构化异常处理 第23章 终止处理程序 第24章 异常处理程序与软件异常 24 1 通过实例理解异常过滤程序和异常处理程序 24 1 1 funcmeister1函数 24 1 2 funcmeister2函数 24 2 exception_execute_handler1 24 2 1 一些有用的例子 24 2 2 全局展开 24 2 3 停止全局展开 24 3 exception_continue_execution 24 4 exception_continue_search0 24 5 getexceptioncode2 24 6 getexceptioninformation6 24 7 软件异常 第25章 未处理异常、向量化异常处理与c++异常 25 1 unhandledexceptionfilter函数详解 25 2 即时调试 25 3 电子表格示例程序 25 4 向量化异常和继续处理程序 25 5 c++异常与结构化异常的比较 25 6 异常与调试器 第26章 错误报告与应用程序恢复 26 1 windows错误报告控制台 26 2 可编程的windows错误报告 26 3 对进程中所有的问题报告进行定制 26 4 问题报告的创建与定制 26 4 1 创建一个自定义的问题报告 26 4 2 设置报告参数:werreportsetparameter 26 4 3 将小型转储文件放入报告:werreportadddump8 26 4 4 将任意文件放入报告:werreportaddfile9 26 4 5 修改对话框文本:werreportsetuioption0 26 4 6 提交错误报告:werreportsubmit0 26 4 7 关闭问题报告:werreportclosehandle 26 4 8 customized wer示例程序 26 5 应用程序的自动重启与恢复 26 5 1 应用程序的自动重启 26 5 2 对应用程序恢复的支持 第ⅵ部分 附录a 构建环境 附录b 消息处理宏、子控件宏和api宏 索引 译者序你是否在Windows平台上开发应用程序?你是否希望对Windows提供的各项服务有更深入的理解?你是否需要使用Windows提供的高级功能?你是否在找寻一些Windows实用技术来解决项目中的难题?如果对上述问题的回答是肯定的,那么你绝对不应该错过本书。 自这本《Windows核心编程(第4版)》出版至今,转眼间已经过去了八年。在这八年期间,Windows世界已经发生了许多变化,Windows XP、Windows 2003、Windows Vista以及Windows Server 2008相继推出。与之对应的,《Windows核心编程》(第5版)也与时俱进,针对最新的Windows操作系统进行更新,为我们了解并发挥最新的平台特性提供了宝贵的指引。 这是一本Windows系统编程的权威专著,许多年之前我就已经读过它的第4版;这是一本生动的教科书,它帮助我更深入地了解Windows系统;同时它又是一本参考书,在我开发Windows应用程序的过程中遇到问题时,我会到本书中寻找答案。希望它同样能够为你答疑解惑,并解决你的实际问题。 本书由葛子昂、周靖、廖敏共同翻译:第8~22章由葛子昂翻译,第1~6章由周靖翻译,第23~26章及附录由廖敏翻译,第7章由刘江友情客串翻译,全书由葛子昂最终审阅和统稿。鉴于时间和精力有限,一些翻译难免存在不足甚至错误之处,为此我建立了一份网上勘误表。如果读者发现任何错误,都可以通过该网页与我联系,一旦确认,我会立即将其更新到勘误表中。 最后,感谢Jeffrey和Christophe在本书翻译过程中不厌其烦地解答我的问题,核实并纠正英文版中发现的一些错误。感谢李劲松、王渊峰、张羿、孙展波、谭映辉以及孙祺对中文版的全部或部分章节进行了审阅并提出宝贵的意见。感谢潘爱民在百忙中抽空阅读部分译稿,并给以反馈。感谢妻儿和家人对我的理解和支持,本书的翻译工作占用了本应属于你们的时间,现在终于可以有更多时间来陪伴你们了。 ——译 序 2 1993年,本书第1版Advanced NT出版的时候,我和三个朋友一起成立了一个“四喜工作室”。由于四个人只有一台计算机,所以我们几个每天一睁眼,第一件事情便是抢占计算机,这台286配置简单,根本无法与现在的计算机相提并论,而且当时也没有网络,所以计算机的用途非常有限,主要也就是文字处理,玩游戏,编简单程序等,但它带给我们的乐趣至今难以忘怀。受限于当时的环境,数据和游戏的交换也基本上在圈内好友之间进行,就像搞地下活动一样约好时间地点碰头。幸运的是,由此结交了一大批计算机爱好者,后来他们大多成为IT届的领军人物。 其时,从大环境看,我国网络也开始悄然起步。1993年年初,中国科学院高能物理研究所接入斯坦福大学线性加速器中心的64K专线开通,国内科学家开始在国内使用电子邮件。随后几个月的时间,金桥工程和域名体系的确立和部署,三大院校网的连接,最终将我国带入信息高速公路,推动我国IT业的迅猛发展。 由此而来的便是计算机类图书和报纸期刊的炙手可热,《电脑报》等IT媒体相继崛起,计算机图书更是出现供不应求的现象,在当时,即便是国外引进翻译出版的图书,也能轻松突破几万册的销量,计算机图书的发展达到全盛时期。 在这个时期,国内开发人员先后成为Jeffrey和McConell等大师的拥趸。因为在IT界,虽然资深程序员不胜枚举,但同时又是深受程序员喜爱的技术图书作家的乏善可陈。而像他们那样,曾经写过多部书,部部都引人入胜,令人醍醐灌顶,就更是凤毛麟角。他们是Windows编程世界中的中流砥柱,也是Windows技术当之无愧的布道者。曾有不少读者放言,只要是Jeffrey的书,他们必定会花时间研读,并加以收藏。这一点都不夸张,我们同时代的很多人都是在这批书的滋润下成长起来的。他们熟读了Advanced NT之后,又如痴如狂地捧起了Advanced Windows和Programming Application for Microsoft Windows等续作。他们是Jeffrey的粉丝,同时也是微软开发阵营的主力军。 随着微软宣布放弃对Windows XP以及以前版本的支持,Windows Vista的普及势在必行,迟早会安装到普通用户的计算机上。Windows Vista有很多吸引人的新特性,相信大家不用不知道,一用忘不了。(在翻译Microsoft Press的Windows Vista Inside Out一书的过程中,我已经深切体会到她的妙处)。作为一名程序员,有必要在第一时间适应在新的操作系统下的编程。历经15年,本书也随着Windows操作系统的“改朝换代”,升级到第5版,即Windows via C/C++。如果您要用C/C++开发Windows应用程序,那就不要走弯路,直接让Jeffrey告诉您如何利用Windows的新特性和新函数来编写出高效、优美的Windows应用程序。 对于本书的学习,谨以《史记 孔子世家》中孔子学琴一文与大家共勉(请原谅,这里引用了我另一本书的译序,因其寓意深刻,故忍不住又拿出来与大家分享?): 前言 Microsoft Windows是一个复杂的操作系统。它提供的特性非常丰富,对任何个人而言,要想完全透彻地理解整个系统几乎不可能。其复杂性也使我们很难确定应该把主要精力集中在哪些地方。万丈高楼平地起,就我个人而言,我始终倾向于从最底层开始,深刻理解系统的基本构件。一旦掌握了最基本的东西,就很容易向自己的知识库中逐步添加更多高层的东西。所以本书将集中介绍Windows的基本构件和基础概念,对于构架和实现Windows应用程序来说,这些都是必须掌握的。简而言之,本书是向读者介绍各个Windows特性,并介绍如何通过C和C++语言来了解并使用这些特性。 虽然本书不会涵盖某些Windows概念,比如组件对象模型(Component Object Model ,后面简称为COM),但COM是在进程、线程、内存管理、DLL、线程本地存储区以及Unicode等基本构件的基础上构建的。如果了解了这些基本构件,那么要理解COM就相当于理解如何使用这些基本构件。对于那些试图跳过这些基本构件,悉心钻研COM体系结构的朋友,我深表同情。要完善知识库,他们还有很长一段路要走,这必然会对他们的代码和软件开发进度产生很大的负面影响。 Microsoft NET Framework的公共语言运行时(Common Language Runtime,CLR)是本书未涉及的另一种技术(感兴趣的朋友可以阅读我的另一本专著《框架设计:CLR via C#》)。不过,CLR是作为动态链接库(dynamic link library,DLL)中的一个COM对象来实现的,它需要被载入到进程中,它需要使用线程来执行代码,它需要处理Unicode字符串,它还需要在内存中对这些字符串进行管理。因此,本书所介绍的基本构件仍然有助于软件开发人员编写托管代码。此外,借助于CLR的平台调用(Platform Invocation,P/Invoke)技术,我们可以调用本书所介绍的各种Windows API。 如此一来,本书的宗旨是介绍每一个Windows开发人员都应该掌握的基本的Windows构件(至少在我看来如此)。在介绍每一个构件的时候,我还会描述系统是如何使用这些构件的,我们自己的应用程序如何充分利用这些构件。在很多章中,我会介绍如何创建自己的构件。我们自己的构件一般都实现为普通函数或C++类,它们把一些Windows构件组合在一起,从而创造出一个整体,其结果远远大于各部分之和。 64位Windows操作系统 Microsoft发售支持x86 CPU体系结构的32位Windows操作系统已经有多年的历史。如今,Microsoft还提供支持x64和IA-64 CPU体系结构的64位Windows操作系统。基于这些64位CPU体系结构的计算机迅速为市场所接受。事实上,在不远的将来,所有台式机和服务器都将使用64位CPU。为此,Microsoft已发表声明,Windows Server 2008将是最后一款32位版本的Windows操作系统!对于开发人员而言,现在是时候集中精力让自己的应用程序能在64位Windows操作系统上正常运行了。贯穿本书,将全面覆盖相关的知识,让开发人员的应用程序能够在64位Windows操作系统(同时也包括32位Windows)上正常运行。 应用程序从64位地址空间所获得的最大的好处是,能够轻松处理大量数据,因为应用程序的进程不再受限于2GB可用地址空间。即使应用程序并不需要所有这些空间,Windows本身也可以利用这个显然大得多的地址空间(约8TB)来加快运行速度。 对于64位Windows操作系统,我们需要了解哪些呢?下面简单看一看。 64位Windows内核是32位Windows内核的移植版本。这意味着以前所学的32位Windows所有细节和难点均适用于64位Windows。事实上,Microsoft已经修改了32位Windows的源代码,使其既可以编译生成32位系统,也可以编译生成64位系统。两个系统使用同一个源代码库,所以新的特性和缺陷的修复会同时应用于这两个系统。 因为内核使用相同的代码和基本概念,所以在两个平台上的Windows API是一样的。这意味着我们不必重新设计或实现应用程序,就能让它在64位Windows操作系统上运行。我们只需要对源代码做少许改动,然后重新构建应用程序即可。 为了保持向后兼容性,64位Windows操作系统是可以执行32位应用程序的。但是,如果应用程序是作为64位应用程序来生成的,那么它的性能会有显著的提高。 因为移植32位代码非常容易,所以64位Windows操作系统中已经有很多的设备驱动程序、工具和应用程序了。遗憾的是,Visual Studio是32位的,而且Microsoft似乎还并不急于将其移植为64位的。不过,好消息是32位的Visual Studio在64位Windows操作系统上的确运行得非常好,只不过其数据结构的地址空间有限。而且,我们还可以用Visual Studio来调试64位应用程序。 并不需要学习太多新知识。大多数数据类型仍然保持32位宽度,这是很多读者很高兴看到的。它们是INT,DWORD,LONG和BOOL等。事实上,大多数情况下我们只需要担心指针和句柄,因为它们现在变成64位了。 对于如何将现有源代码修改为64位,Microsoft已经提供了相当丰富的信息,所以我们不打算在本书中深入这些细节。不过,在我写每一章的时候,我都会考虑到64位Windows操作系统。在适当的时候,我会加入64位Windows的特定信息。同时,我还在64位Windows中编译和测试了本书中的所有示例程序。所以,如果读者效仿书中的示例程序和我的做法,那么创建一个能够为32位或64位Windows编译的源代码库应该完全不成问题。 《Windows核心编程(第5版)》中有哪些新内容 在过去,本书曾经被冠以“Advanced NT”,“Advanced Windows”和“Programming Application for Microsoft Windows”等名字。为保持这个传统,本书的第5版也有一个新的书名,即Windows via C/C++。新的书名表示本书是为打算理解Windows的C和C++程序员设计的。第5版全面覆盖了Windows XP,Windows Vista和Windows Server 2008中的170个新增函数和Windows特性。 有些章已经全部重写,比如第11章,这一章解释了如何使用新的线程池API。第4版原有的各章都已经大幅修订,以突出介绍新的特性。例如,在第4章,现在已经包含了用户账户控制(User Account Control)的介绍,第8章现在介绍了新的同步机制。 同时,我还更全面地介绍了C/C++运行库如何与操作系统交互,特别强调安全性和异常处理。最后,第5版新增了两章内容,解释了I/O操作的工作原理以及如何深入理解新的Windows Error Reporting系统,此系统改变了我们必须考虑应用程序错误报告和应用程序恢复的方式。 序言当Jeffrey请我为本书写一篇序的时候,我爽快地答应了。我还记得在上个世纪90年代早期寻找本书第1版《高级Windows NT编程》(Advanced Windows NT)时的情形。那时我刚刚开始开发Windows应用程序。在我开发诸如Filemon,Regmon以及HandleEx(现在叫Process Explorer)之类的应用程序时,它既是一本指南,又是一本参考手册。本书第1版面向Windows系统编程,而Charles Petzold的《Windows编程》(Programming Windows)则面向用户界面编程。 在过去的几年中,Jeffrey已经将他关注的重点转向了托管代码,这使得为本书作序对我来说大有意义。Jeffrey已经成为 NET CLR和C#系统编程的权威,当Microsoft还在设计 NET的时候,他的这种转换就已经开始了。他还不时地“嘲弄”我和我的搭档David Solomon——我们合著了《深入解析Windows操作系统》(Windows Internals)系列,说本机代码编程(native code programming)已经日暮西山。我和David始终坚信本机代码编程由于具有不同的API、不同的失败语义(failure semantics)、不同的部署方式以及不同的运行时特征,因此将继续满足某一类应用程序的需求,或者至少是满足部分应用程序的需求。相当一部分Windows客户端应用程序仍然是用本机代码编写的,甚至Microsoft的旗舰服务器端应用程序,包括IIS、SQL Server以及Exchange,几乎完全是用本机代码编写的,或者使用了用本机代码编写的组件。因此,我将本书视作Jeffrey对我们这种信念的无言的肯定。 Windows一直在演化,本书亦是如此。它之前已经经历了许多个版本,甚至书名也一变再变。比如,本书上一版名为Programming Applications for Microsoft Windows。但无论书名如何改变,它的每一版在我的书架上都占有一席之地。(这与Jeffrey给我在书上签名不无关系,不仅如此,而且所签的内容还是我选的,比如“我从Mark那里学到了一切”之类可供炫耀的话。)这一个版本不仅只是换了一个新的书名,它还介绍了Windows Vista和Windows Server 2008中引入的最新API,包括线程、安全、异常处理以及I/O。 本书提供了大量的编程实例,既紧凑又有效地展示了各种关键概念,这使得它尤其有用。许多作者在将代码与读者分享的时候,并没有认识到许多开发人员会直接将代码复制和粘贴到将要发行的应用程序中去。但与我们在互联网上搜索到的代码不同,Jeffrey和Christophe已经确保书中的代码在编写时兼顾了高质量和高准确性。 我相信,无论您是Windows应用程序编程的新手,还是完全用本机代码来编写应用程序或通过P/Invoke来调用 NET Framework未提供的API的老手,都会发现本书的价值。它将有助于发挥强大的平台特性并降低其复杂度,帮助开发人员开发伸缩性更好、更可靠、更安全以及性能更高的应用程序。显然,它依旧会出现在我的书架上,希望这一次Jeffrey和Christophe都能为我签上“我从Mark那里学到了一切”。 Mark Russinovich (Windows Internals作者) Technical Fellow Microsoft Corporation 媒体评论无论是Windows编程新手,还是完全用本机代码来编程或通过P/Invoke来调用,NET Framework未提供的API的老手,都会发现本书的价值。 ——Mark Russinovich,《深入解析Windows操作系统》作者 要想在Windows编程方面更上一层楼,迟早都需要好阅读并领会本书的内容。 ——Francis Glassborow,C/C++用户协会前主席 搞Windows程序设计有两方面的资源是不可或缺的:一是MSDN,另一个便是本书。 ——侯捷,著名技术作家 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。