【文章內(nèi)容簡(jiǎn)介】
對(duì)于程序?qū)懽髡邅?lái)說(shuō), API 是由操作系統(tǒng) 定義的。 API 包含了所有應(yīng)用程序能夠使用的 windows 函數(shù),同時(shí)包含了相關(guān)的數(shù)據(jù)類(lèi)型和結(jié)構(gòu)。在 Windows 中,API 還意味著一個(gè)特殊的程序架構(gòu),我們將在每章的開(kāi)頭進(jìn)行研究。 一般而言, Windows API 自 Windows 以來(lái)一直保持一致,沒(méi)什么重大改變。具有 Windows 98 程序編程經(jīng)驗(yàn)的程序員會(huì)對(duì) Windows 程序的原始碼感覺(jué)非常熟悉。 API 改變的方式就是進(jìn)行增強(qiáng)。 Windows 支持不到 450 個(gè)函數(shù)調(diào)用,現(xiàn)在已有了上千種函數(shù)調(diào)用。 Windows API 和它的語(yǔ)法的最大變化 來(lái)自于從 16 位架構(gòu)向 32位架構(gòu)轉(zhuǎn)化的過(guò)程中。 Windows 從版本 到版本 使用 16位 Intel 808 808和286 微處理器上所謂的分段內(nèi)存模式,由于兼容性的原因,從 386 開(kāi)始的 32 位Intel 微處理器也支持該模式。在這種模式下,微處理器緩存器的大小為 16 位,因此 C的 int 數(shù)據(jù)型態(tài)也是 16 位寬。在分段內(nèi)存模式下,內(nèi)存地址由兩個(gè)部分組成 一個(gè) 16位段 (segment)指針和一個(gè) 16位偏移量 (offset)指標(biāo)。從程序?qū)懽髡叩慕嵌瓤?,這非常凌亂并帶來(lái)了 long 或 far 指針 (包括段地址和偏移量地址 )和 short 或 near 指標(biāo) (包括帶有假定段地址的偏移量地址 )的區(qū)別。 從 Windows NT 和 Windows 95 開(kāi)始, Windows 支持使用 Intel 38 486 和Pentium 處理器 32 位模式下的 32 位平坦尋址內(nèi)存模式。 C語(yǔ)言的 int 數(shù)據(jù)型態(tài)也擴(kuò)展為 32 位的值。為 32 位版本 Windows 編寫(xiě)的程序使用簡(jiǎn)單的平坦線(xiàn)性空間尋址的 32 位指針值。 用于 16 位版本 Windows 的 API(Windows 到 Windows )現(xiàn)在稱(chēng)作Win16。用于 32 位版本 Windows 的 API(Windows 9 Windows 98 和所有版本的Windows NT)現(xiàn)在稱(chēng)作 Win32。許多函數(shù)調(diào)用在從 Win16 到 Win32 的轉(zhuǎn)變中保持相同,但有些需要增強(qiáng)。例如,圖像坐標(biāo)點(diǎn)由 Win16 中的 16 位值變?yōu)?Win32 中的 32 位值。此外,某些 Win16 函數(shù)返回一個(gè)包含在 32位整數(shù)值中的二維坐標(biāo)點(diǎn)。這在 Win32 中不可能,因此增加的新函數(shù)以不同方式運(yùn)作。 所有 32 位版本的 Windows 都支持 Win16 API(以確保和舊有應(yīng)用程序兼容 )和 Win32 API(以運(yùn)行新應(yīng)用程序 )。非常有趣的是, Windows NT 與 Windows 95及 Windows 98 的工作方式不同。在 Windows NT 中, Win16 函數(shù)通過(guò)一個(gè)轉(zhuǎn)換層被轉(zhuǎn)化為 Win32 函數(shù),然后被操作系統(tǒng)處理。在 Windows 95 和 Windows 98中,該操作正相反: Win32 函數(shù)通過(guò)轉(zhuǎn)換層轉(zhuǎn)換為 Win16 函數(shù),再由操作系統(tǒng)處理。 現(xiàn)在, Windows 都能夠支持 Win32 API。然而,每個(gè)操作系統(tǒng)依然都支持某些不被別的操作系統(tǒng)支持的某些功能特性。因?yàn)樗鼈兊南嗤幨窍喈?dāng)可觀的,所以有可能編寫(xiě)在兩個(gè)操作系統(tǒng)下都可執(zhí)行的程序。而且,人們普遍認(rèn)為這兩個(gè)產(chǎn)品最終會(huì)合而為 一。 語(yǔ)言選項(xiàng) 使用 C 語(yǔ)言和原始的 API 不是編寫(xiě) Windows 98 程序的唯一方法。然而,這種方法卻能提供給您最佳的性能、最強(qiáng)大的功能和在發(fā)掘 Windows 特性方面最大的靈活性。可執(zhí)行文件相對(duì)較小且運(yùn)行時(shí)不要求外部鏈接庫(kù) (自然, Windows DLL 自身除外 )。最重要的是,不管您最終以什么方式開(kāi)發(fā) Windows 應(yīng)用程序,熟悉 API 會(huì)使您對(duì) Windows 內(nèi)部有更深入的了解。了解越深入,應(yīng)用越自如。 雖然我認(rèn)為學(xué)習(xí)古典的 Windows 程序設(shè)計(jì)對(duì)任何 Windows 程序?qū)懽髡叨际侵匾?,但我不建議使用 C和 API 編寫(xiě) 每個(gè) Windows 應(yīng)用程序。許多程序員,特別是那些為公司內(nèi)部開(kāi)發(fā)程序或在家編寫(xiě)娛樂(lè)程序的程序員喜歡輕松的開(kāi)發(fā)環(huán)境,例如 Microsoft Visual Basic 或者 Borland Delphi(它結(jié)合了對(duì)象導(dǎo)向的 Pascal 版本 )。這些環(huán)境使程序員將精力集中于應(yīng)用程序的用戶(hù)界面和相關(guān)用戶(hù)接口對(duì)象的程序代碼上。在專(zhuān)業(yè)程序員中,特別是那些開(kāi)發(fā)商業(yè)應(yīng)用程序的程序員 Microsoft Visual C++和 Microsoft Foundation Class Library(MFC)是近年來(lái)流行的選擇。 MFC 在 一組 C++對(duì)象類(lèi)別中封裝了許多Windows 程序設(shè)計(jì)中的瑣碎細(xì)節(jié)。最近, Inter 和 World Wide Web 的流行大力推廣著 Sun Microsystems 的 Java,這是一個(gè)受 C++啟發(fā)卻與微處理器無(wú)關(guān)的程序設(shè)計(jì)語(yǔ)言,而且結(jié)合了可在幾個(gè)操作系統(tǒng)平臺(tái)上執(zhí)行的圖形應(yīng)用程序開(kāi)發(fā)工具組。 顯然,很難說(shuō)哪種方法更有利于開(kāi)發(fā) Windows 應(yīng)用程序。更主要的是,也許是應(yīng)用程序自身的特性決定了所使用的工具。不管您最后實(shí)際上使用什么工具寫(xiě)作程序,學(xué)習(xí) Windows API 將使您更深入地了解 Windows 工作的方式。Windows 是一個(gè)復(fù)雜的系統(tǒng),在 API 上增加一個(gè)程序?qū)懽鲗硬⑽礈p少它的復(fù)雜性,僅僅是掩蓋了它,早晚您會(huì)碰到它。了解 API 會(huì)給您更好的補(bǔ)救機(jī)會(huì)。 在原始的 Windows API 之上的任何軟件層都必定將您限制在全部功能的一個(gè)子集內(nèi)。您也許發(fā)現(xiàn),例如,使用 Visual Basic 編寫(xiě)應(yīng)用程序非常 理想,然而它不允許您做一個(gè)或兩個(gè)很簡(jiǎn)單的基本工作。在這種情況下,您將不得不使用原始的 API。 API 定義了作為 Windows 程序員所需的一切。沒(méi)有什么方法比直接使用 API 更萬(wàn)能的了。 MFC 尤其問(wèn)題百出。雖然它大幅簡(jiǎn)化了某些工作 (例如 OLE),我卻經(jīng)常發(fā)現(xiàn)要讓它們按我所想的去工作時(shí),就會(huì)在其它特性 (例如 Document/View 架構(gòu) )上碰壁。 MFC 還不是 Windows 程序設(shè)計(jì)者所追求的靈丹妙藥,很少有人認(rèn)為它是一個(gè)好的對(duì)象導(dǎo)向設(shè)計(jì)的模型。然而 MFC 程序員對(duì) MFC 的對(duì)象類(lèi)別定義受益頗深,并會(huì)在編程時(shí)經(jīng)常參考 MFC原碼,然而要搞懂這些原碼就必須學(xué)習(xí)Windows API。 程序開(kāi)發(fā)環(huán)境 Microsoft Visual C++ 中包括 C 編譯器和其它編譯及連結(jié) Windows 程序所需的文件和工具等。它還包括一個(gè)可編輯原始碼、以交談方式建立資源 (如圖標(biāo)和對(duì)話(huà)框 )以及編輯、編譯、執(zhí)行和測(cè)試程序的環(huán)境。 API 文件 本書(shū)不是 Windows API 權(quán)威的正式文件的替代品。當(dāng)您安裝 Visual C++ 時(shí),您將得到一個(gè)包括 API 文件的在線(xiàn)求助系統(tǒng)。您可通過(guò)訂閱 MSDN或使用 Microsoft 網(wǎng)站上的在線(xiàn)求助系統(tǒng)更新該文件 。連接到,并選擇「 MSDN Library Online」。 在 Visual C++ 中,從「 Help」菜單項(xiàng)選擇「 Contents」項(xiàng)目開(kāi)啟 MSDN窗口。 API 文件按樹(shù)形結(jié)構(gòu)組織,尋找標(biāo)有「 Platform SDK」的部分,所有在本書(shū)中引用的文件都來(lái)自于該部分。我將向您介紹如何從「 Platform SDK」開(kāi)始尋找以斜線(xiàn)分層分門(mén)別類(lèi)的文件的位置。 (我知道「 Platform SDK」是整個(gè)MSDN 知識(shí)庫(kù)中較為晦澀的部分,但我敢保證那是 Windows 程序設(shè)計(jì)的基本核心。 )例如,