Windows核心編程精講

《Windows核心編程精講》,是Jeffrey Richter Christophe Nasarre 編著,清華大學出版社於2008年9月出版的書籍。

基本信息

作者:(美)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,另一個便是本書。
——侯捷,著名技術作家

相關詞條

熱門詞條

聯絡我們