譯者序
前言
第一部分 程序員必讀
第1章 對程序錯誤的處理
1.1 定義自己的錯誤代碼
1.2 ErrorShow示例應用程序
第2章 Unicode
2.1 字符集
2.1.1 單字節(jié)與雙字節(jié)字符集
2.1.2 Unicode:寬字節(jié)字符集
2.2 為什么使用Unicode
2.3 Windows 2000與Unicode
2.4 Windows 98與Unicode
2.5 Windows CE與Unicode
2.6 需要注意的問題
2.7 對COM的簡單說明
2.8 如何編寫Unicode源代碼
2.8.1 C運行期庫對Unicode的支持
2.8.2 Windows定義的Unicode數據類型
2.8.3 Windows中的Unicode函數和ANSI函數
2.8.4 Windows字符串函數
2.9 成為符合ANSI和Unicode的應用程序
2.9.1 Windows字符串函數
2.9.2 資源
2.9.3 確定文本是ANSI文本還是Unicode文本
2.9.4 在Unicode與ANSI之間轉換字符串
第3章 內核對象
3.1 什么是內核對象
3.1.1 內核對象的使用計數
3.1.2 安全性
3.2 進程的內核對象句柄表
3.2.1 創(chuàng)建內核對象
3.2.2 關閉內核對象
3.3 跨越進程邊界共享內核對象
3.3.1 對象句柄的繼承性
3.3.2 改變句柄的標志
3.3.3 命名對象
3.3.4 終端服務器的名字空間
3.3.5 復制對象句柄
第二部分 編程的具體方法
第4章 進程
4.1 編寫第一個Windows應用程序
4.1.1 進程的實例句柄
4.1.2 進程的前一個實例句柄
4.1.3 進程的命令行
4.1.4 進程的環(huán)境變量
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 psa Process、psa Thread和binherit Handles
4.2.3 fdwCreate
4.2.4 pvEnvironment
4.2.5 pszCurDir
4.2.6 psiStartlnfo
4.2.7 ppiProclnfo
4.3 終止進程的運行
4.3.1 主線程的進入點函數返回
4.3.2 ExitProcess函數
4.3.3 TerminateProcess函數
4.3.4 進程終止運行時出現的情況
4.4 子進程
4.5 枚舉系統中運行的進程
第5章 作業(yè)
5.1 對作業(yè)進程的限制
5.2 將進程放入作業(yè)
5.3 終止作業(yè)中所有進程的運行
5.4 查詢作業(yè)統計信息
5.5 作業(yè)通知信息
5.6 JobLab示例應用程序
第6章 線程的基礎知識
6.1 何時創(chuàng)建線程
6.2 何時不能創(chuàng)建線程
6.3 編寫第一個線程函數
6.4 CreateThread函數
6.4.1 psa
6.4.2 cbStack
6.4.3 pfnStartAddr和pvParam
6.4.4 fdwCreate
6.4.5 pdwThreadID
6.5 終止線程的運行
6.5.1 線程函數返回
6.5.2 ExiThread函數
6.5.3 TerminateThread函數
6.5.4 在進程終止運行時撤消線程
6.5.5 線程終止運行時發(fā)生的操作
6.6 線程的一些性質
6.7 C/C++運行期庫的考慮
6.7.1 Oops——錯誤地調用了CreateThread
6.7.2 不應該調用的C/C++運行期庫函數
6.8 對自己的ID概念應該有所了解
第7章 線程的調度、優(yōu)先級和親緣性
7.1 暫停和恢復線程的運行
7.2 暫停和恢復進程的運行
7.3 睡眠方式
7.4 轉換到另一個線程
7.5 線程的運行時間
7.6 運用環(huán)境結構
7.7 線程的優(yōu)先級
7.8 對優(yōu)先級的抽象說明
7.9 程序的優(yōu)先級
7.9.1 動態(tài)提高線程的優(yōu)先級等級
7.9.2 為前臺進程調整調度程序
7.9.3 Scheduling Lab示例應用程序
7.10 親緣性
第8章 用戶方式中線程的同步
8.1 原子訪問:互鎖的函數家族
8.2 高速緩存行
8.3 高級線程同步
8.4 關鍵代碼段
8.4.1 關鍵代碼段準確的描述
8.4.2 關鍵代碼段與循環(huán)鎖
8.4.3 關鍵代碼段與錯誤處理
8.4.4 非常有用的提示和技巧
第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 SingleObjectAndWait
第10章 線程同步工具包
10.1 實現關鍵代碼段:Optex
10.2 創(chuàng)建線程安全的數據類型和反信標
10.3 單個寫入程序/多個閱讀程序的保護
10.4 實現一個WaitForMultipleExpressions函數
第11章 線程池的使用
11.1 方案1:異步調用函數
11.2 方案2:按規(guī)定的時間間隔調用函數
11.3 方案3:當單個內核對象變?yōu)橐淹ㄖ獱顣r調用函數
11.4 方案4:當異步I/O請求完成運行時調用函數
第12章 纖程
12.1 纖程的操作
12.2 Counter示例應用程序
第三部分 內存管理
第13章 Windows的內存結構
13.1 進程的虛擬地址空間
13.2 虛擬地址空間如何分區(qū)
13.2.1 NuLL指針分配的分區(qū)——適用于Windows 2000和Windows 98
13.2.2 MS-DOS/16位Windows應用程序兼容分區(qū)——僅適用Windows 98
13.2.3 用戶方式分區(qū)——適用Windows 2000和Windows 98
13.2.4 64KB禁止進入的分區(qū)——僅適用于Windows 2000
13.2.5 共享的MMF分區(qū)——僅適用于Windows 98
13.2.6 內核方式分區(qū)——適用于Windows 2000和Windows 98
13.3 地址空間中的區(qū)域
13.4 提交地址空間區(qū)域中的物理存儲器
13.5 物理存儲器與頁文件
13.6 保護屬性
13.6.1 Copy-on-Write訪問
13.6.2 特殊的訪問保護屬性的標志
13.7 綜合使用所有的元素
13.7.1 區(qū)域的內部情況
13.7.2 與Windows 98地址空間的差別
13.8 數據對齊的重要性
第14章 虛擬內存
14.1 系統信息
14.2 虛擬內存的狀態(tài)
14.3 確定地址空間的狀態(tài)
14.3.1 VMQuery函數
14.3.2 虛擬內存表示例應用程序
第15章 在應用程序中使用虛擬內存
15.1 在地址空間中保留一個區(qū)域
15.2 在保留區(qū)域中的提交存儲器
15.3 同時進行區(qū)域的保留和內存的提交
15.4 何時提交物理存儲器
15.5 回收虛擬內存和釋放地址空間區(qū)域
15.5.1 何時回收物理存儲器
15.5.2 虛擬內存分配的示例應用程序
15.6 改變保護屬性
15.7 清除物理存儲器的內容
15.8 地址窗口擴展——適用于Windows 2000
第16章 線程的堆棧
16.1 Windows 98下的線程堆棧
16.2 C/C++運行期庫的堆棧檢查函數
16.3 Summation示例應用程序
第17章 內存映射文件
17.1 內存映射的可執(zhí)行文件和DLL文件
17.1.1 可執(zhí)行文件或DLL的多個實例不能共享靜態(tài)數據
17.1.2 在可執(zhí)行文件或DLL的多個實例之間共享靜態(tài)數據
17.1.3 APPInst示例應用程序
17.2 內存映射數據文件
17.2.1 方法1:一個文件一個緩存
17.2.2 方法2:兩個文件一個緩存
17.2.3 方法3:一個文件兩個緩存
17.2.4 方法4:一個文件,零緩存
17.3 使用內存映射文件
17.3.1 步驟1:創(chuàng)建或打開文件內核對象
17.3.2 步驟2:創(chuàng)建一個文件映射內核對象
17.3.3 步驟3:將文件數據映射到進程的地址空間
17.3.4 步驟4:從進程的地址空間中撤消文件數據的映像
17.3.5 步驟5和步驟6:關閉文件映射對象和文件對象
17.3.6 文件倒序示例應用程序
17.4 使用內存映射文件來處理大文件
17.5 內存映射文件與數據視圖的相關性
17.6 設定內存映射文件的基地址
17.7 實現內存映射文件的具體方法
17.8 使用內存映射文件在進程之間共享數據
17.9 頁文件支持的內存映射文件
17.10 稀疏提交的內存映射文件
第18章 堆棧
18.1 進程的默認堆棧
18.2 為什么要創(chuàng)建輔助堆棧
18.2.1 保護組件
18.2.2 更有效的內存管理
18.2.3 進行本地訪問
18.2.4 減少線程同步的開銷
18.2.5 迅速釋放堆棧
18.3 如何創(chuàng)建輔助堆棧
18.3.1 從堆棧中分配內存塊
18.3.2 改變內存塊的大小
18.3.3 了解內存塊的大小
18.3.4 釋放內存塊
18.3.5 撤消堆棧
18.3.6 用C++程序來使用堆棧
18.4 其他堆棧函數
第四部分 動態(tài)鏈接庫
第19章 DLL基礎
19.1 DLL與進程的地址空間
19.2 DLL的總體運行情況
19.3 創(chuàng)建DLL模塊
19.3.1 輸出的真正含義是什么
19.3.2 創(chuàng)建用于非Visual C++工具的DLL
19.4 創(chuàng)建可執(zhí)行模塊
19.5 運行可執(zhí)行模塊
第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 DL_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 函數轉發(fā)器
20.5 已知的DLL
20.6 DLL轉移
20.7 改變模塊的位置
20.8 綁定模塊
第21章 線程本地存儲器
21.1 動態(tài)TLS
21.2 靜態(tài)TLS
第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 用windows 98上的內存映射文件插入代碼
22.8 用CreateProcess插入代碼
22.9 掛接API的一個示例
22.9.1 通過改寫代碼來掛接API
22.9.2 通過操作模塊的輸入節(jié)來掛接API岡
22.9.3 LastMsgBoxInfo示例應用程序
第五部分 結構化異常處理
第23章 結束處理程序
23.1 通過例子理解結束處理程序
23.2 Funcensteinl
23.3 Funcenstein2
23.4 Funcenstein3
23.5 Funcfurter1
23.6 突擊測驗:FuncaDoodleDoo
23.7 Funcenstein4
23.8 Funcaramal
23.9 Funcarama2
23.10 Funcarama3
23.11 Funcarama4:最終的邊界
23.12 關于finally塊的說明
23.13 Funcfurter2
23.14 SEH結束處理示例程序
第24章 異常處理程序和軟件異常
24.1 通過例子理解異常過濾器和異常處理程序
24.1.1 Funcmeister1
24.1.2 Funcmeister2
24.2 EXCEPTION_EXECUTE_HANDLER
24.2.1 一些有用的例子
24.2.2 全局展開
24.2.3 暫停全局展開
24.3 EXCEPTION_CONTINUE_EXECUTION
24.4 EXCEPTION_CONTINUE_SEARCH
24.5 Get Exception Code
24.6 Get Exception Information
24.7 軟件異常
第25章 未處理異常和C++異常
25.1 即時調試
25.2 關閉異常消息框
25.2.1 強制進程終止運行
25.2.2 包裝一個線程函數
25.2.3 包裝所有的線程函數
25.2.4 自動調用調試程序
25.3 程序員自己調用UnhandledExceptionFilter
25.4 UnhandledExceptionFilter函數的一些細節(jié)
25.5 異常與調試程序
25.6 C++異常與結構性異常的對比
第六部分 窗口
第26章 窗口消息
26.1 線程的消息隊列
26.2 將消息發(fā)送到線程的消息隊列中
26.3 向窗口發(fā)送消息
26.4 喚醒一個線程
26.4.1 隊列狀態(tài)標志
26.4.2 從線程的隊列中提取消息的算法
26.4.3 利用內核對象或隊列狀態(tài)標志喚醒線程
26.5 通過消息發(fā)送數據
26.6 Windows如何處理ANSI/Unicode字符和字符串
第27章 硬件輸入模型和局部輸入狀態(tài)
27.1 原始輸入線程
27.2 局部輸入狀態(tài)
27.2.1 鍵盤輸入與焦點
27.2.2 鼠標光標管理
27.3 將虛擬輸入隊列同局部輸入狀態(tài)掛接在一起
27.3.1 LISLab示例程序
27.3.2 LISWatch示例程序
第七部分 附錄
附錄A 建立環(huán)境
附錄B 消息分流器、子控件宏和API宏