精通Windows API(函數(shù)、接口、編程實(shí)例)上篇_第1頁
精通Windows API(函數(shù)、接口、編程實(shí)例)上篇_第2頁
精通Windows API(函數(shù)、接口、編程實(shí)例)上篇_第3頁
精通Windows API(函數(shù)、接口、編程實(shí)例)上篇_第4頁
精通Windows API(函數(shù)、接口、編程實(shí)例)上篇_第5頁
已閱讀5頁,還剩295頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

精通WindowsAPI(函數(shù)、接口、編程實(shí)例)上篇目錄\h第1章idows應(yīng)用序開發(fā)入門16\h1.1第一實(shí)例程序16\h1.1.1sart.exe16\h1.1.2indosAPI17\h1.1.3程入口函數(shù)17\h1.1.4stat.c代碼分析17\h1.2編譯碼18\h1.2.1安裝isualtudio18\h1.2.2安裝MicrosoftPlatformSK19\h1.2.3集成MicrosoftPlatformS與isualC++速成版20\h1.2.4istaSDK與isualtudi0200821\h1.2.5isualtudio專業(yè)或團(tuán)隊(duì)系統(tǒng)版22\h1.2.6使圖形化IE建立工程、進(jìn)行編譯22\h1.2.7解決方案”與“工程”23\h1.2.8使命令行工具編譯23\h第2章idowsAI概要24\h2.1indos數(shù)據(jù)類型24\h2.1.1indos數(shù)據(jù)類型示例25\h2.1.2indos數(shù)據(jù)類型與標(biāo)準(zhǔn)C數(shù)據(jù)類型的關(guān)系28\h2.1.3indos數(shù)據(jù)類型與indowsAPI28\h2.1.4indos中的數(shù)據(jù)結(jié)構(gòu)29\h2.2ndosAI的功能分類29\h2.2.1系基本服務(wù)29\h2.2.2系管理31\h2.2.3用界面31\h2.2.4圖和多媒體34\h2.2.5網(wǎng)絡(luò)34\h2.2.6系安全34\h2.2.7其功能35\h2.3ndosAI核心DLL35\h2.3.1Krn132.dll35\h2.3.2User32.dll36\h2.3.3Gdi32.dll36\h2.3.4標(biāo)準(zhǔn)函數(shù)36\h2.3.5其他ll36\h2.4nicode和多字節(jié)36\h2.4.1W本和A版本的PI38\h2.4.2nicode與ASGI的轉(zhuǎn)換39\h2.5對(duì)ndow程序設(shè)計(jì)規(guī)范的建議39\h第3章開發(fā)工具配置與使用41\h3.1使用iualC/C++編譯鏈接工具41\h3.1.1編器cl.exe41\h3.1.2資源編譯器rc.exe46\h3.1.3鏈器link.exe47\h3.1.4其工具53\h3.1.5編鏈接工具依賴的環(huán)境變量54\h3.1.6示:使用/D選項(xiàng)進(jìn)行條件編譯57\h3.2使用PlatformSDK58\h3.2.1PlatformSD的目錄結(jié)構(gòu)與功能58\h3.2.2為譯鏈接工具設(shè)置環(huán)境變量59\h3.2.3PlatformSD工具集61\h3.2.4ndowsistaSDK63\h3.3編Makefile63\h3.3.1使用nake.exe構(gòu)建工程63\h3.3.2Makefile實(shí)例65\h3.3.3注釋65\h3.3.4宏66\h3.3.5描塊:目標(biāo)、依賴項(xiàng)和命令68\h3.3.6akefile預(yù)處理69\h3.3.7在PlatformSD的基礎(chǔ)上使用nmake70\h3.4使用nDbg調(diào)試72\h3.4.1安inDbg72\h3.4.2編可調(diào)試的程序73\h3.4.3nDbg命令74\h3.4.4調(diào)過程演示74\h3.5集成發(fā)環(huán)境isualtudio77\h3.5.1工類型選擇與配置77\h3.5.2isualtudio快捷式79\h3.5.3生項(xiàng)目79\h3.5.4調(diào)試79\h3.5.5選與設(shè)置80\h3.6開發(fā)境配置總結(jié)81\h第4章文件系統(tǒng)82\h4.1概述82\h4.1.1文系統(tǒng)的基本概念82\h4.1.2文系統(tǒng)主要AI83\h4.2磁盤驅(qū)動(dòng)器管理85\h4.2.1遍卷并獲取屬性85\h4.2.2操驅(qū)動(dòng)器掛載點(diǎn)91\h4.2.3判光驅(qū)中是否有光盤96\h4.2.4獲磁盤分區(qū)的總?cè)萘俊⒖臻e容量、簇、扇區(qū)信息98\h4.3文件目錄管理101\h4.3.1刪、復(fù)制、重命名、移動(dòng)文件102\h4.3.2創(chuàng)、打開、讀寫文件,獲取文件大小105\h4.3.3創(chuàng)目錄1\h4.3.4獲程序所在的目錄、程序模塊路徑,獲取和設(shè)置當(dāng)前目錄12\h4.3.5查文件、遍歷指定目錄下的文件和子目錄15\h4.3.6遞遍歷目錄樹18\h4.3.7獲、設(shè)置文件屬性和時(shí)間120\h4.4內(nèi)存射文件125\h4.4.1使MappingFile提高文件讀寫的效率125\h4.4.2通MappingFile在進(jìn)程間傳遞和共享數(shù)據(jù)130\h4.4.3通文件句柄獲得文件路徑133\h4.5總結(jié)136\h第5章內(nèi)存管理137\h5.1indos內(nèi)存管理原理137\h5.1.1基概念137\h5.1.2分與分段內(nèi)存管理、內(nèi)存映射與地址轉(zhuǎn)換138\h5.1.3進(jìn)的內(nèi)存空間140\h5.1.4虛內(nèi)存布局、內(nèi)存的分工、堆與棧142\h5.1.5內(nèi)的保護(hù)屬性和存取權(quán)限142\h5.1.6本章I列表142\h5.2堆管理144\h5.2.1獲堆句柄、分配與再分配堆144\h5.2.2獲堆中內(nèi)存塊的大小信息148\h5.2.3釋內(nèi)存、銷毀堆149\h5.3全局(lobal)和局部(Local)內(nèi)存管理151\h5.3.1Gobal函數(shù)151\h5.3.2Local函數(shù)152\h5.3.3使全局和局部函數(shù)分配和釋放內(nèi)存、改變內(nèi)存塊屬性153\h5.4虛擬存管理154\h5.4.1虛地址空間與內(nèi)存分頁154\h5.4.2分和釋放可讀可寫的虛擬內(nèi)存頁面154\h5.4.3修內(nèi)存頁面狀態(tài)和保護(hù)屬性、將頁面鎖定在物理內(nèi)存中157\h5.4.4管其他進(jìn)程的虛擬內(nèi)存158\h5.5內(nèi)存作與內(nèi)存信息管理159\h5.5.1復(fù)充、移動(dòng)、清零內(nèi)存塊、防止緩沖區(qū)溢出159\h5.5.2獲當(dāng)前系統(tǒng)內(nèi)存使用情況161\h5.5.3判內(nèi)存指針的可用性162\h5.6各種存分配方式的關(guān)系與比較163\h5.6.1標(biāo)準(zhǔn)內(nèi)存管理函數(shù)與indows內(nèi)存管理API的關(guān)系163\h5.6.2功性區(qū)別164\h5.6.3效的區(qū)別164\h第6章進(jìn)程、線程和模塊165\h6.1基本念165\h6.1.1應(yīng)程序與進(jìn)程165\h6.1.2控臺(tái)應(yīng)用程序與圖形用戶界面應(yīng)用程序166\h6.1.3動(dòng)鏈接庫、模塊166\h6.1.4線、纖程與作業(yè)167\h6.1.5權(quán)與優(yōu)先級(jí)167\h6.2進(jìn)程理167\h6.2.1創(chuàng)進(jìn)程、獲取進(jìn)程相關(guān)信息、獲取啟動(dòng)參數(shù)168\h6.2.2編控制臺(tái)程序和圖形用戶界面應(yīng)用程序173\h6.2.3獲和設(shè)置環(huán)境變量173\h6.3線程纖程176\h6.3.1創(chuàng)線程、退出線程、獲取線程信息177\h6.3.2掛、恢復(fù)、切換、終止線程179\h6.3.3創(chuàng)遠(yuǎn)程線程、將代碼注入其他進(jìn)程中執(zhí)行182\h6.3.4創(chuàng)纖程、刪除纖程、調(diào)度纖程185\h6.3.5纖與線程的互相轉(zhuǎn)換186\h6.4進(jìn)程態(tài)信息191\h6.4.1PSAPI與oolhelpPI191\h6.4.2遍系統(tǒng)中的進(jìn)程193\h6.4.3列進(jìn)程的模塊、線程197\h6.4.4進(jìn)的堆使用、內(nèi)存占用、虛擬內(nèi)存大小,頁面錯(cuò)誤情況199\h6.5動(dòng)態(tài)接庫200\h6.5.1加、釋放DLL、通過句柄獲取DLL相關(guān)信息201\h6.5.2編動(dòng)態(tài)鏈接庫、導(dǎo)出函數(shù)201\h6.5.3創(chuàng)動(dòng)態(tài)鏈接庫工程,配置DLL編譯鏈接選項(xiàng)203\h6.5.4運(yùn)時(shí)動(dòng)態(tài)獲取DLL導(dǎo)出函數(shù)地址并調(diào)用204\h6.5.5聲導(dǎo)出函數(shù)、創(chuàng)建lib庫,為其他模塊提供導(dǎo)入表調(diào)用接口205\h6.5.6通構(gòu)建導(dǎo)入表調(diào)用DLL導(dǎo)出函數(shù)206\h第7章線程同步207\h7.1基本理207\h7.1.1線同步的過程207\h7.1.2同對(duì)象208\h7.1.3等函數(shù)208\h7.2同步象示例209\h7.2.1使用事件對(duì)象(Event)209\h7.2.2使互斥對(duì)象(Mutex)214\h7.2.3使信號(hào)量控制訪問共享數(shù)據(jù)的線程數(shù)量217\h7.2.4使可等待計(jì)時(shí)器(ier)221\h7.3等待程和線程的執(zhí)行完成224\h第8章服務(wù)225\h8.1基本念225\h8.1.1服控制器(SCM)225\h8.1.2服程序226\h8.1.3服控制管理程序226\h8.1.4系服務(wù)管理工具226\h8.1.5服的屬性226\h8.2編寫務(wù)程序227\h8.2.1入函數(shù)227\h8.2.2服主函數(shù)227\h8.2.3控處理函數(shù)228\h8.3實(shí)現(xiàn)服務(wù)的控制和管理231\h8.3.1創(chuàng)、刪除服務(wù)231\h8.3.2啟、停止服務(wù),向服務(wù)發(fā)送控制請(qǐng)求234\h8.3.3管服務(wù)狀態(tài)、配置服務(wù)、服務(wù)的依賴關(guān)系237\h第9章圖形用戶界面244\h9.1字符面程序244\h9.1.1基概念244\h9.1.2控臺(tái)讀寫246\h9.1.3控臺(tái)字體、顏色等屬性,操作屏幕緩存249\h9.1.4控臺(tái)事件259\h9.2圖形戶界面:基本概念262\h9.2.1窗口262\h9.2.2窗類263\h9.2.3消和消息處理函數(shù)263\h9.2.4控件263\h9.2.5資源264\h9.2.6對(duì)框264\h9.3圖形戶界面:窗口264\h9.3.1注窗口類266\h9.3.2創(chuàng)窗口267\h9.3.3窗消息處理函數(shù)269\h9.3.4窗屬性、位置和大小273\h9.3.5窗顯示方式274\h9.3.6.線消息隊(duì)列和消息循環(huán)274\h9.4圖形戶界面:控件275\h9.4.1reiew控件275\h9.4.2為reiew控件增加節(jié)點(diǎn)277\h9.4.3reiew右鍵菜單278\h9.4.4Listew控件280\h9.4.5為L(zhǎng)istiew控件增加分欄282\h9.4.6為L(zhǎng)istiew控件增加項(xiàng)283\h9.4.7文框控件284\h9.4.8為本框控件設(shè)置文字285\h9.5界面源286\h9.5.1資腳本(.rc)286\h9.5.2資源定義和頭文件289\h9.5.3在序中使用資源289\h9.6菜單290\h9.6.1菜資源和菜單句柄290\h9.6.2動(dòng)增加、刪除、設(shè)置菜單及菜單項(xiàng)291\h9.6.3菜消息處理292\h9.7對(duì)話框292\h9.7.1創(chuàng)對(duì)話框292\h9.7.2對(duì)框消息處理函數(shù)293第1章indows應(yīng)用程序開發(fā)入門如何開始Windows應(yīng)用程序開發(fā)的學(xué)習(xí)呢?本書將從一個(gè)最簡(jiǎn)單的Windows應(yīng)用程序入手講解Windows應(yīng)用程序設(shè)計(jì)中的基本概念編程工具的使用安裝與使用方法通過本章的學(xué)習(xí),讀者將會(huì)對(duì)Windows應(yīng)用序的設(shè)計(jì)有一個(gè)初步的、直觀的認(rèn)識(shí)。1.1第一個(gè)實(shí)例程序本節(jié)給出一個(gè)完整的實(shí)例程序并對(duì)該程序源代碼進(jìn)行分析通過本節(jié)的學(xué)習(xí)讀者可以了解Windows應(yīng)用序源代碼的必要組成部分以及它們的組織結(jié)構(gòu)。1.1.1 start.exestart.exe是本書的第一個(gè)實(shí)例,創(chuàng)建一個(gè)簡(jiǎn)單的消息對(duì)話框。實(shí)例1-1第一個(gè)Windows應(yīng)用程序start.exe打開書配套光盤,在第一章實(shí)例代碼目錄中找到可執(zhí)行文件start.exe,運(yùn)行start.exe,會(huì)彈如圖1-1所示的消息對(duì)話框。這就是一個(gè)最簡(jiǎn)單的Windows應(yīng)用序?qū)嵗\(yùn)行的效果,實(shí)現(xiàn)代碼如下:1.1.2 indowsAPI實(shí)例1-1中,程序最核心的功能實(shí)現(xiàn)使用了WindowsAPI的MessageBox函數(shù)。就像C言有一系列庫函數(shù)一樣任何一種程序開發(fā)平臺(tái)都會(huì)提供眾多的接口函數(shù)供開發(fā)人員使用。Windows應(yīng)用程序的開發(fā)核心問題是如何使用WindowsSDK所提供的API。所謂API是“ApplicationProgramInterface”的簡(jiǎn)寫,中文含義為“應(yīng)用程序接口”它是一系列函數(shù)宏數(shù)據(jù)類型數(shù)據(jù)結(jié)構(gòu)的集合運(yùn)行于Windows系統(tǒng)的用程序可以使用這些操作系統(tǒng)提供接口來完成應(yīng)用程序需要的功能。MessageBox函數(shù)是Windows眾多API中的一個(gè),其的功能是彈出一個(gè)話框。1.1.3 程序入口函數(shù)WinMain函數(shù)是程序入口點(diǎn),相當(dāng)于C語言的main函數(shù),定義如下:WinMain函數(shù)有4個(gè)參數(shù):hInstance、hPrevIntance、lCmLine、nCmdhOW。

第一個(gè)數(shù)是hInstance,數(shù)據(jù)類型是HINSTANCE,此參數(shù)表示應(yīng)用程序本次運(yùn)行實(shí)例的句柄。

第二個(gè)數(shù)是hPrevInstance,數(shù)據(jù)類型也是HINSTANCE,表示應(yīng)用程序之前運(yùn)行實(shí)例的句,但是在實(shí)際應(yīng)用中,此參數(shù)始終為NULL。

第三個(gè)數(shù)lpCmdLine是運(yùn)行時(shí)數(shù)。如在cmd命令行中運(yùn)行start.exeCommandArguments”那么lpCmdLine就指向字符串“CommandArguments”作用與C言中main函數(shù)的參數(shù)作用類似。數(shù)據(jù)類型LPSTR是WindowsAPI中常用的字符串類型。

最后一參數(shù)是nCmdShow數(shù)據(jù)型是int示應(yīng)用程序窗(如果有的顯示狀態(tài)。WinMain函數(shù)的返回類型是int型的。在實(shí)例1-1中,使用了如下語句來返回。1.1.4 start.c代碼分析現(xiàn)在分析1.1.1小節(jié)給出的實(shí)例1-1程序的源代碼start.c。在代碼的最開始是源代碼文件信息的注釋。之后是預(yù)編譯聲明,在本實(shí)例中共有兩條預(yù)編譯聲明。這一行代碼指明了包括Windows.h。Wndows.h是Windows應(yīng)用程序開發(fā)中常用的頭文件在Windows應(yīng)用程序開發(fā)中所使用的很多的數(shù)據(jù)類型結(jié)PI接口函數(shù)都在Windows.h或Windows.h所包含的他頭文件中進(jìn)行了聲明比如實(shí)例1-1所使用的MessageBox函數(shù)。如果不聲明包括Windows.h,那么譯器將不能識(shí)別MessageBox。這行碼指明將源文件編譯生成目標(biāo)文(.obj后將目標(biāo)文件鏈接成可執(zhí)行文件的過程中需要使用到User32.lib,因?yàn)閁ser32.lib中包含了MessageBox的鏈接信息。如果在鏈接程序時(shí),調(diào)用鏈接器的參數(shù)中指明了鏈接時(shí)需要使用到user32.lib,這—句程序代碼可以省略(參見第3章。代碼接下來是WinMain函數(shù)的定義。在WinMain函數(shù)中調(diào)了MessageBox函數(shù)。MessageBox函數(shù)的原型如下:第一參數(shù)hWnd消息框所屬的窗口的句柄,可以設(shè)置為NULL。第二參數(shù)lpText是字符串,表示消息框所顯示的消息。第三參數(shù)lpCaption是字符串,表示消息框的標(biāo)題。第四參數(shù)uType是消息框的類型,在實(shí)例1-1中設(shè)置為“MB_OK”,意思是消息框包含一個(gè)“確定”按鈕。在MessageBox函數(shù)調(diào)用之后,程序返回O,束WinMain函數(shù),退出進(jìn)程。1.2編譯代碼本書使用VisualStudio和PlatformSDK為程序編譯和連接的工具各版本的VisualStudio括VisualStudi06.0VsualStudi02003VsualStudi0200VisualStdi02008都可以用于編譯本書中的實(shí)例程序。過去已經(jīng)發(fā)行了的所有Windows版本,每一個(gè)版本都有一個(gè)PlatformSDK。Windows系統(tǒng)為應(yīng)用程序提供了很多的調(diào)用接口,如果要使用這些調(diào)用接口就需要用于PlatformSDKPlatfomSDK提供開發(fā)Windows應(yīng)用程序所必須的頭文件庫文件等Windows應(yīng)用程序的開發(fā)接口是C\C++語言形式。讀者可以使用PlatformSDKforWindowsXPSP2、PlatformSDKforWindowsServer203PlatformSDKforindowsVisaaVisualC++2005ExpressEdtionVisualC++速成版)是VisualStudi0205的一個(gè)子版本。包括了編譯和連接的全部工具VC\VC++8.0,對(duì)編譯本書的示例程序已經(jīng)足夠使用。微軟公司提供官方下載,下載地址為http://msdn2.mirosoft.cm/zh-cn/expres/default.aspx各個(gè)版本的PlatformSDK都也可以從微軟公司網(wǎng)站上下載到。在本中,將綜合使用VisualC++ExpressEdition2005、VisualC++ExpresEditon2008以及McrosoftPlatformSDKXPS2版本003SP1版本和Vista版。1.2.1 安裝iualtudioVisualStudio包括速成版、專業(yè)版和團(tuán)隊(duì)系統(tǒng)版本(VisualStudioTeamSystem)。速成版是免費(fèi)的版本專業(yè)版和團(tuán)隊(duì)系統(tǒng)版本是商業(yè)版但是速成版的功能與專版的功能并沒有太大的區(qū)別。如果讀者使用VisualC++速成版,需單獨(dú)安裝MicrosoftPlatformSDK,并將其與VisualStudio集成在起,才可以在本機(jī)進(jìn)行Windows應(yīng)用程序的開發(fā)。VisualC++速成版安裝步驟如下。(1)從軟公司的站點(diǎn)上下載中文版的Visual++速成,也可以從本書配套光盤中獲得。運(yùn)行vcsetup.exe。(2)單“下一步”按鈕。在這步,讀者需要選擇需要安裝的組件。推薦安裝圖形化的IDE,IDE將大方便代碼的編輯、編譯等工作。不安裝圖形化IDE,者也可以使用命令行工具來編譯程序。(3)在安裝的過程中,需要連接上Intrnet。安裝程序?qū)⑾螺dWindowsInstaller3.1、NETFramewok和VisualC++2005速成版行安裝。安裝成后,進(jìn)行注冊(cè)就可以使用了。在VisualStudio安裝目錄下的bin文件夾中,讀者可以看到包括cl.exe、nmake.exe、link.exe、lib.exerc.exe等編譯和鏈接工具。安裝了VisualC++成版后僅僅可以進(jìn)行標(biāo)準(zhǔn)C程序和C++程序的開發(fā)但是還不能調(diào)用WindowsAPI,無法成一個(gè)Windows應(yīng)用程序所需的大部分功能,因?yàn)槿鄙貾latformSDK。1.2.2 安裝MicosoftPlatformSDKSDK是SoftwareDevlopmentit的縮寫即“軟件開發(fā)工具包”MicrooftlatfrmSDK是進(jìn)行Windows應(yīng)用程序的開發(fā)包。每一個(gè)Windows行版本都會(huì)有對(duì)應(yīng)的PlaformSDK。SDK中使用與這個(gè)版本相一致的頭文件和庫文件等每一個(gè)版本W(wǎng)indows中新增加的API數(shù)據(jù)結(jié)構(gòu)中會(huì)在其中 體現(xiàn)。下面以PlatformSDKforinowsServer203R2為例明,其版本的安裝法類似。如圖1-2示。單擊“Next”按鈕,選擇安裝選項(xiàng)。在一般情況下,選擇典型安裝可以滿足使用需要。這里需要進(jìn)行一些設(shè)置,所以選擇“Custom”,如圖1-3所示。在出現(xiàn)如圖1-4所示的安裝選擇時(shí),選擇“ConfigurationOptions”→“RegisterEnvironmentVariables”選項(xiàng),并選擇完全安裝。如果不選擇此項(xiàng),VisualStudio工具將無法找到SDK。在安裝完成后,可以從PlatformSDK安裝目錄中找到若干頭文件和庫文件,如Windows.h、Kme132.lib等文件,這些就是我們進(jìn)行Windows應(yīng)用程序開發(fā)所必不可少的支持。1.2.3 集成MicosoftPlatformSDK與sualC++速成版在安完成后,還需要對(duì)VisualC++速成版進(jìn)行設(shè)置,使編譯鏈接工具可以找到SDK。如果編譯鏈接工具找不到SDK,那在源代碼中的API調(diào)將會(huì)產(chǎn)生編譯鏈接錯(cuò)誤。在VisualC++速成版中進(jìn)行如下操作。在菜單中選擇“工具”→“選項(xiàng)”,出現(xiàn)“選項(xiàng)”對(duì)話框,如圖1-5所示。1.設(shè)置IDE環(huán)境在“選項(xiàng)”對(duì)話框中選擇“項(xiàng)目和解決方案”→“VC++目錄”。在“顯示以下內(nèi)容的目錄”中選擇列表中選擇“包含文件,單擊下方的“新建”按鈕選擇PlatformSDK安裝目錄下的“Include”文夾。如:C:\ProgramFiles\MicrosoftPatformSDK\Include.在選列表中選擇“庫文件”單擊下方的“新建”按鈕目錄下的“Lib”文件夾,如:C:\ProgramFiles\MicrosoftPatformSDKYLib.在選列表中選擇“可執(zhí)行”單擊下方的“新建”按鈕目錄下的“Bin”文件夾,如:C:\ProgramFilesYMicrosofiPatformSDK\Bin。2.設(shè)置環(huán)境變量

選擇PlatformDK安裝選擇PlatformDK安裝如果安裝PlatformSDK時(shí)沒有選擇安裝“ConfigurationOptions”→“RegisterEnvironmentVariables或者選擇了“Typical”安裝模塊那么還需要為系統(tǒng)添加環(huán)境變量。MSSdk變量:值為SDK安裝目錄。Mstools變量:值為SDK安裝目錄。INETSDK變量:值為SDK安裝目錄。Bkoffice變量:值為SDK安裝目錄。Basemake變量:值為%SSdk%\Iclude\BKOffice.Mak。INCLUDE變量:值為%MSSdk%\Include\。LIB變量:值為%MSSdk%\Lib\。并在Path變量前加上%SSdk%\Bin\;%MSSdk%\in\WinNT\。VisualStudio專業(yè)版不需要上述設(shè)置但是也可以使用這種方法來更新VisualStudio所使用的SDK的版本。1.2.4 istaSDK與isualtudi02008截止書編寫時(shí),WindowsVista版本的SDK已經(jīng)發(fā)布,VisualStudio的最新版本也已經(jīng)升級(jí)到了2008版VisulStdi02008也區(qū)分為速版專業(yè)版團(tuán)隊(duì)系統(tǒng)版等VistaSDK的安裝、使用與方法與之前版本的SDK安和使用方法類似。VisualStudi02008的安裝與使用方法也與ⅥsualStudi02005的安裝使月j方法也區(qū)別不大,速成版的VisualStudio仍然可以免費(fèi)使用。但是新版本的SDK和VisualStudio提供了更豐富的功能,使用也更便捷。建議有條件的讀者使用新版本SDK和VisualStudio。1.2.5 isualtudio專業(yè)版或團(tuán)隊(duì)系統(tǒng)版如果讀者有VisualStudio專業(yè)版或團(tuán)隊(duì)系統(tǒng)版,可直接進(jìn)行安裝,專業(yè)版已經(jīng)內(nèi)嵌了PlatformSDK。在安完成后,不需配置就可使用。1.2.6 使用圖形化IDE建立工程、進(jìn)行編譯在完成安裝和設(shè)置后,本小節(jié)將以VisualC++速成版為說明如何編譯1.1.1節(jié)的程序。

打開VisualC++速成。

新建工程在菜單中選擇“文件一新建工程”在新建工程對(duì)話框中的“VisualC++”類別下,選擇“空項(xiàng)目”,如圖1-6所示。

輸入項(xiàng)目名稱,完成項(xiàng)目的建立。

在“解決方案裝源管理器”中,右鍵單擊工程名稱,選擇“添加一新建項(xiàng)”,在“添加新項(xiàng)”對(duì)話框中,選擇“代碼”,鍵入文件名稱“start”,文件后綴是“.c”或者是“.cpp”都可以,如圖1-7所示。

將實(shí)例1-1代碼復(fù)到start.c中。

如果不需要調(diào)試,在工具欄(位于菜單欄下)中將“Debug”改為“Release”。

在菜單中選擇“生成一生成解決方案”(或使用快捷鍵,一般是F7。

如果編譯沒有報(bào)錯(cuò)則在程序目錄下會(huì)有“Debug”或”“Release文件夾可執(zhí)行文件位于此。運(yùn)行可執(zhí)行文件,得到實(shí)例1-1運(yùn)行結(jié)果。1.2.7 “解決方案”與“工程”“解決案”是指若干工程的集合一般大型的應(yīng)用程序都不是一個(gè)可執(zhí)行文件構(gòu)成的,可能包括一個(gè)exe文件若干個(gè)dll文件等個(gè)解決方案下可以有零個(gè)多個(gè)工程個(gè)工程可以生成一個(gè)可執(zhí)行文件??梢越鉀Q方案添加或刪除工程。1.2.8 使用命令行工具編譯除了用圖形化的IDE工具,還可以使用nmake工具對(duì)程序進(jìn)行編譯和鏈接。nmake是一個(gè)字符界面程序,通過Makefile配置。在使用nmake工具時(shí)需要使用VisualStudio的命令行。將實(shí)例1-1中的代存為start.c,然后將實(shí)例1-2的容存為文件makefile。實(shí)例1-2編譯start.c的makefile本實(shí)是一個(gè)makefile文件以用于編譯start.c譯時(shí)需要使用到nmake工具,其代碼如下所示:將makefile文件和start.c文件放在同一目錄下在開始單“VisualStudioTools”目錄下找到“VisualStudi02005\2008命令提示”(VisualStudi02005\2008CommandPrompt)并運(yùn)行。切換到start.c和makefile兩文件所在的目錄,運(yùn)行“nmake.exe”,輸出如下:如果沒有報(bào)告錯(cuò)誤,將在目錄下出現(xiàn)START_BIN”文件夾,star.exe位于此文件夾中。至此已經(jīng)可以使用開發(fā)工具編譯鏈接程序代碼得到可執(zhí)行程序本書第3章還會(huì)詳細(xì)介紹編譯鏈接工具的原理和使用方法。第2章indowsAPI概要本章要講解Windows程序設(shè)計(jì)的一些基本概念包括在Windows應(yīng)用程序設(shè)計(jì)中所使用到的一些特有的數(shù)據(jù)類型對(duì)Windows眾多的API進(jìn)行了分類介紹還初步介紹WindowsAPI與動(dòng)態(tài)鏈接的原理,Windows應(yīng)程序所使用的字符集等。2.1indows數(shù)據(jù)類型WindowsAPI使用了很多Windows自己定義的數(shù)據(jù)類型者可能較為熟悉C語言或C++語言的數(shù)據(jù)類型要熟練使用WindowsAPI必須要熟悉Windows數(shù)據(jù)類這些數(shù)據(jù)類型是Windows特有的。在SDK的相關(guān)頭文件中有定義。在眾的Windows數(shù)據(jù)類型中,最常用的有DWORD、HANDLELPTSTR、WORD、BYTE、CHAR等。在Windows統(tǒng)中,DWORD用于表無符號(hào)整型的數(shù),意為doubleword,32位。在一般情況下BYTE是8位的,而WORD是16位,WORD是32位的。Windows系統(tǒng)的應(yīng)用程序中還具有一個(gè)特有的數(shù)據(jù)類型-HANDLE常HANDLE型的變量用于唯一標(biāo)識(shí)一個(gè)“對(duì)象,如窗口、控件、文件等,Windows平臺(tái)中存在眾多這樣的對(duì)象,對(duì)象是程序操作的目。HANDLE也是一個(gè)32位的數(shù)據(jù)類型。2.1.1 indows數(shù)據(jù)類型示例實(shí)例2-1使用了幾種基本的Windows數(shù)據(jù)類型演示W(wǎng)indows數(shù)據(jù)類型程序中的使用方法。1.實(shí)例2-1常用Windows數(shù)據(jù)類型演示(DWORD/LPSTR/CHAR/INT)本實(shí)定義了幾個(gè)常用常量的Windows數(shù)據(jù)類型包括DWORDLPSTR和CHAR演示了如何使用它們進(jìn)行了復(fù)制、比較大小等操作。在這程序中,使用了4種Windows數(shù)據(jù)類型,分別是LPSTRCHAR、DWORD和INT。LPSTR類型的數(shù)據(jù)是字符串,也就是字符指針,CHAR是字符,DWORD是32位的無符號(hào)整數(shù),INT是32位有符號(hào)整數(shù)。程序行后會(huì)彈出4個(gè)對(duì)話框說明dwMax>dwOne是成立的iMax<iOne也是成立。dwMax與iMax的數(shù)值是一樣的,dwOne與iOne的數(shù)值也是一樣的。但是比較結(jié)果不同,是因?yàn)槎叩臄?shù)據(jù)類型不一樣。2.為什么要使用Windows數(shù)據(jù)類型WindowsAPI函數(shù)數(shù)據(jù)結(jié)構(gòu)等都是采用Windows數(shù)據(jù)類型。比如WindowsAPI數(shù)的入口參數(shù)、返回值等都是Windows數(shù)據(jù)類型。因此學(xué)習(xí)WindowsAPI程序設(shè)計(jì)必須要了解Windows數(shù)據(jù)類型。Windows數(shù)據(jù)類型與WindowsAPI的關(guān)系詳見2.1.3小節(jié)。3.查看Windows數(shù)據(jù)類型的定義在VisualStudio可以查看數(shù)據(jù)類型的定義在數(shù)據(jù)類型的類型(比如“DWORD”)上單擊右鍵,選擇“轉(zhuǎn)到定義,圖2-1所。圖2-1查看變量或數(shù)據(jù)類型的定義可以從SDK的頭文件中看到各類型的類型定義?!癐NT”的定義如下:“DWORD”的定義如下:"CHAR"的定義如下:從中以發(fā)現(xiàn),這些Windows數(shù)據(jù)類型都是從標(biāo)準(zhǔn)C的數(shù)據(jù)類型經(jīng)過類型重定義而來。INT數(shù)據(jù)類是有符號(hào)整型,DWORD據(jù)類型是無符號(hào)整型。這就明了為什么在實(shí)例2-1中INT數(shù)類型的變量iMax實(shí)際是-1”而DWORD類型的變量dwMax實(shí)際是“4294967295,所以會(huì)出現(xiàn)如上的比較結(jié)果。4.最常見的Windows數(shù)據(jù)類型WindowsAPI中還會(huì)用到其他很多的Windows特有的數(shù)據(jù)類型。常用的類型說明如表2.1所示。表2.1 常用的本W(wǎng)indows數(shù)據(jù)類型Windows數(shù)據(jù)類型不止上表中列出類型,還包括其他很多種,主要有各種數(shù)據(jù)的指針,句柄無符號(hào)類型等讀者可以查看數(shù)據(jù)類型的定義來了解Windows數(shù)據(jù)類型本小節(jié)第5點(diǎn)中給出了Windows數(shù)類型命名的規(guī)律在遇到新的數(shù)據(jù)類型時(shí)可以基本推論出數(shù)據(jù)類型的意義。讀者也可以通過查看SDK文檔來了解Windows數(shù)據(jù)類型的更多細(xì)節(jié)。5.Windows數(shù)據(jù)類型名命名的規(guī)律Windows數(shù)據(jù)類型的命名都很有規(guī)律?;緮?shù)據(jù)類型包括BYTE、CHAR、WRDSHORT、DOWRD、INT等。指針類型的命令方式一般是在其指向的數(shù)據(jù)類型前加“LP”或“P”,比如指向DWORD的指針類型為“LPDWORD”和“PDWORD”。各種句柄類型的命令方式一般都是在對(duì)象名前加“H”。Windows系統(tǒng)中有很多對(duì)象,所有表示一個(gè)對(duì)象的數(shù)據(jù)類型都是句柄,每一種對(duì)象都對(duì)應(yīng)著一種句柄類型,比如與位圖(BITMAP)對(duì)應(yīng)的句柄類型為“HBITAP”,與菜單(MENU)對(duì)應(yīng)的句柄類型為“HMENU”,與窗口(WINDOW)對(duì)應(yīng)的句類型為“HWND”。無符號(hào)類型一般是以“U”開頭,比如“INT”是符號(hào)類型,“UINT”是無符號(hào)類型,“LONG”是符號(hào)類型“ULONG”是符號(hào)類型等。2.1.2 indows數(shù)據(jù)類型與標(biāo)準(zhǔn)C數(shù)據(jù)類型的關(guān)系查看Windows數(shù)據(jù)類型定義可以看到所有的Windows數(shù)據(jù)型都是由C數(shù)據(jù)類型經(jīng)過類型重定義得到的。如DWORD實(shí)質(zhì)上就是unsignedong數(shù)據(jù)類型,32位的無符整型。WinDefHk定義如下:而將在Windows程序設(shè)計(jì)中經(jīng)常用到的HANDE類型實(shí)質(zhì)上是無類型指針void。在WinNT.h中有一系統(tǒng)的數(shù)據(jù)類型定義,與HANDLE有關(guān)的定如下:所有的Windows數(shù)據(jù)類型都是通過這種方式在SDK的頭文件中進(jìn)行定義的它們都是來源于標(biāo)準(zhǔn)C的數(shù)類型。而實(shí)上VC編譯器是一個(gè)完整的C編譯器,此外并沒有過多的擴(kuò)展。Windows數(shù)據(jù)類型也不是VC的內(nèi)建類型,而從標(biāo)準(zhǔn)C類型重定義得到。2.1.3 indows數(shù)據(jù)類型與indowsAPIWindowsAPI函數(shù)的參數(shù)、返回值或一些重要的常量用的數(shù)據(jù)類型都是Windows數(shù)據(jù)類型。可以從WindowsAPI的定義中發(fā)現(xiàn)這一點(diǎn)。以幾個(gè)WindowsAPI的定義例,例如本書第1章實(shí)例1-1中所使用的MessageBox函數(shù),如下所示:MessageBox函數(shù)的返回值是int型的,是標(biāo)準(zhǔn)C數(shù)據(jù)類型,但是所有的參數(shù)都使用了Windows數(shù)據(jù)類型如HWND是一種Windows數(shù)據(jù)型用于表示窗口句柄LPCTSTR也是Windows數(shù)類型,表示字符串常量;UINT也是Windows數(shù)類型,為無符號(hào)整型。再如在本書的后續(xù)章節(jié)常會(huì)使用到的ReadFile函數(shù),如下所示:使用了BOOL、HANDLE、LPVOID、DOWRDLPDWORD等Windows數(shù)據(jù)類型。最后一個(gè)參數(shù)則是指向OVERILAPPED構(gòu)的指針。BOOL布爾型值可以是TRUE和FALSEHANDLE是文件句柄類型LPVOID是無類型指針,相當(dāng)于void*,DWORD是無符號(hào)整,LPDWORD是指向DOWRD類型數(shù)據(jù)指針類型。WindowsSDK中也定義了很多類似于OVERIAPPED的結(jié)構(gòu)體類型這些類型是WindowsAPI所不可缺少的部分。很多API數(shù)都是使用這樣的結(jié)構(gòu)體作為參數(shù)或返回結(jié)果。2.1.4 indows中的數(shù)據(jù)結(jié)構(gòu)Windows中包含很多種數(shù)據(jù)結(jié)構(gòu)類型在不同類型的API中會(huì)使用到不同的數(shù)據(jù)結(jié)構(gòu)由于數(shù)據(jù)結(jié)構(gòu)的數(shù)量眾多,將在后續(xù)章節(jié)具體的實(shí)例中介紹實(shí)現(xiàn)每一種功能所使用的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)通常會(huì)作為一些API的參數(shù)輸入。WindowsAPI中的數(shù)據(jù)結(jié)構(gòu)定具有一定的特點(diǎn)如將在第4章中使用到的WIN32_FILE_ATTRIBUTE_DATA數(shù)據(jù)結(jié)構(gòu)的定義如下:Windows系統(tǒng)中類似于這樣的數(shù)據(jù)結(jié)構(gòu)類型定義很多也有很多的API函數(shù)使用到了這些數(shù)據(jù)結(jié)構(gòu)類型讀者應(yīng)該對(duì)這樣的數(shù)據(jù)結(jié)構(gòu)定義有所熟悉這將在Windows應(yīng)用程序設(shè)計(jì)中經(jīng)常使用到。WindowsSDK中,結(jié)構(gòu)體也有自己的命名規(guī)范。一般情況下,Windows系統(tǒng)中用全大寫來命名結(jié)構(gòu)體共用體并使_”來分隔單詞在結(jié)構(gòu)名加“LP或“P”表指向數(shù)據(jù)結(jié)構(gòu)的指針。2.2indowsAPI的功能分類WindowsAPI所能實(shí)的功能包括很多方面,在進(jìn)行應(yīng)用程序的開發(fā)時(shí),開發(fā)人員可能會(huì)使用到文件進(jìn)程內(nèi)存權(quán)限系統(tǒng)信息等系統(tǒng)的基本服務(wù)和系統(tǒng)管理類的API可能會(huì)用到圖形用戶界面、控件等函數(shù)和對(duì)象,可能需要在界面上繪制圖像處理多媒體信息等,還包括進(jìn)行網(wǎng)絡(luò)通信開發(fā)等。2.2.1 系統(tǒng)基本服務(wù)系統(tǒng)基本服務(wù)是WindowsAPI最基本的內(nèi)容,是最常使用到的程序接口。系統(tǒng)基本服務(wù)API包括以下幾個(gè)方面。1.文件系統(tǒng)對(duì)文的基本操作包括文件的創(chuàng)建打開讀寫關(guān)閉刪除文件屬性的設(shè)置與獲取,目錄操作,以及磁盤分卷的操作,還包括鏡像文件、加密文件系統(tǒng)等。2.內(nèi)存管理主要內(nèi)在的分配、共享、釋放等內(nèi)容,包括虛擬內(nèi)存管理、分頁機(jī)制、堆管理等。3.進(jìn)程、線程和模塊包括程主程序(exe)模動(dòng)態(tài)鏈接庫(dll)的編線程的基本概念線程創(chuàng)建、遍歷、同步等操作;進(jìn)程與權(quán)限;線程與纖程等內(nèi)容。4.設(shè)備I/O、驅(qū)動(dòng)程序控制包括備對(duì)象等基本概念。加載與卸載驅(qū)動(dòng)程序,控制驅(qū)動(dòng)程序,與驅(qū)動(dòng)程序通信等。5.調(diào)試與錯(cuò)誤處理包括何開發(fā)調(diào)試器程序運(yùn)行錯(cuò)誤的處理日志的記錄Windows可執(zhí)行文件的結(jié)構(gòu)等。6.Windows系統(tǒng)信息包括冊(cè)表的操作如打開注冊(cè)表讀取寫入鍵值創(chuàng)建刪除鍵還包括系統(tǒng)基本信息的獲取和設(shè)置,如系統(tǒng)目錄、系統(tǒng)版本、計(jì)算機(jī)名等。7.進(jìn)程間通信包括用共享文件進(jìn)行進(jìn)程間通信的方法使用消息進(jìn)行進(jìn)程間通信的方法使用郵槽、管道等進(jìn)行進(jìn)程間通信的方法,使用網(wǎng)絡(luò)共享進(jìn)行進(jìn)程間通信的方法。8.定時(shí)器與消息機(jī)制消息制是Windows系統(tǒng)中很重要的一種機(jī)制幾乎所有的Windows應(yīng)用程序都在與消息打交道而Windows的消息機(jī)制又是依賴于定時(shí)器的所以了解Windows消息機(jī)是學(xué)習(xí)Windows應(yīng)用程序開發(fā)的重要內(nèi)容。9.其他Windows的系統(tǒng)基本服務(wù)還包括性能監(jiān)視電源管理索引與數(shù)據(jù)存儲(chǔ)等也將在本書中有所涉及。10.實(shí)例2-2將系統(tǒng)目錄信息寫入systemroot.txt本實(shí)使用了Windows系統(tǒng)基本服務(wù)中的部分API,實(shí)現(xiàn)將系統(tǒng)目錄路徑寫入文件中。在這里不對(duì)實(shí)現(xiàn)原理做過多的解釋只是使讀者對(duì)Windows系統(tǒng)服務(wù)API有初步的了解后續(xù)章還將詳細(xì)介紹這些程序接口的使用方法。運(yùn)行序,在程序所在的目錄會(huì)生成文件“systemroot.txt”,文件容為系統(tǒng)目錄。2.2.2 系統(tǒng)管理系統(tǒng)理是Windows系統(tǒng)中很重要的內(nèi)容Windows系統(tǒng)提供了以下方面的API應(yīng)用程序開發(fā)人員使用包括管理控制臺(tái)接口程序安裝系統(tǒng)恢復(fù)任務(wù)調(diào)度Windows運(yùn)程管理。2.2.3 用戶界面用戶界開發(fā)是Windows應(yīng)用程序開發(fā)的重要內(nèi)容Windos用戶界面要包括兩個(gè)部分,WindowsShell和Windows圖形用戶界面Windows圖形用戶界面包括窗口對(duì)象的相關(guān)內(nèi)容,界面資源,控件、用戶數(shù)據(jù)交換(粘貼板等)和用戶輸入的處理。1.窗口化包括一些基本數(shù)據(jù)概念和對(duì)象:窗口類、消息對(duì)列、窗口過程(消息處理函數(shù)、窗口屬性等。主要括的API有窗口類注冊(cè)的函數(shù)、窗口建立與關(guān)閉函數(shù)、窗口屬性修改函數(shù)等。2.資源資源是Windows應(yīng)程序中很重要的一項(xiàng)內(nèi)容在可執(zhí)行文件中專門有用于存儲(chǔ)資源的節(jié)。這里所說的資源是界面資源包圖標(biāo)菜字符串版本信息對(duì)話框態(tài)光標(biāo)插入號(hào)(Carets)等。資源處理涉及眾多API函數(shù)。3.用戶輸入處理包括對(duì)話框、鍵盤加速器(快捷鍵、鍵盤輸入、鼠標(biāo)輸入、原始數(shù)據(jù)輸入等。這些概念是程序通過用戶界面與用戶進(jìn)行交互的基本概念。4.?dāng)?shù)據(jù)交換包括Atom(包括若干字符串和標(biāo)識(shí)符粘貼板數(shù)據(jù)復(fù)制動(dòng)態(tài)數(shù)據(jù)交接等基本概念,是用戶和應(yīng)用程序通過用戶界面進(jìn)行數(shù)據(jù)交換的主要載體。5.Windows圖形界面通用控件Windows系統(tǒng)提供了不少于30種的控件供應(yīng)用程序使用,其中最常用的幾種包括Edit控件(文本框、Button控件(按鈕、ListView控件(列表、ToolTp控件(提示框、ComboBox控件(下拉選擇框、Tree-View控件(樹、Rich-Edit控件(多功能文本框、Tab控件(分頁、Proces控件(進(jìn)條)等。6.WindowsShellWindows桌面瀏覽器(explore.exe)的功能強(qiáng)大,WindowsShell應(yīng)用程序可以利用WindowsShell桌面的程接口達(dá)到管理系統(tǒng)定制圖標(biāo)和默認(rèn)程序擴(kuò)展桌面功能等目的。有關(guān)面及控件的使用方法與原則將在第9章詳細(xì)介紹。WindowsShell程序設(shè)計(jì)相對(duì)獨(dú)立,將在第12詳細(xì)介紹。7.實(shí)例2-3窗口創(chuàng)建以及消息處理basic.c本實(shí)演示W(wǎng)indows用戶界面API的基本功能使讀者對(duì)Windows應(yīng)用界面開發(fā)有最基本的認(rèn)識(shí),本實(shí)例詳細(xì)的實(shí)現(xiàn)原理還會(huì)在第9章中詳細(xì)介紹。本實(shí)例使用了與圖形用戶界面相關(guān)的一些函數(shù),目的在于使讀者對(duì)用戶界面接口API有一個(gè)初步的認(rèn)識(shí)實(shí)例中首先注冊(cè)了窗口類然后創(chuàng)建了一個(gè)窗口創(chuàng)建窗口時(shí)指定的窗口的屬性和窗口消息的處理函數(shù)。函數(shù)消息的處理函數(shù)大多調(diào)用系統(tǒng)默認(rèn)函數(shù)來處理。2.2.4 圖像和多媒體Windows的圖像引擎和多媒體編程有多種接口,包括最基本的GDI、GDI+,以及更高級(jí)的OpenGLDirectX等圖像引擎編程接口DirectX和OpenGL游戲開發(fā)動(dòng)畫制作等方面應(yīng)用比較廣泛,使用它們進(jìn)行應(yīng)用程序開發(fā)需要專門的SDK本書只講解GDI,對(duì)一般的應(yīng)用程序開發(fā),已經(jīng)足夠使用。GDI的基本概念包括圖像(Image)、位圖(Bitmaps、筆(Pen)、畫刷(Brush)、文本和字體(TextandFonts)線(Line)區(qū)域(Regions)、形狀(Shapes)等?;镜墓δ苁菍?duì)顯示設(shè)備進(jìn)行控制、獲取和修改相關(guān)配置,在計(jì)算機(jī)屏幕上顯示用戶所需要顯示的內(nèi)容。GDI涉及眾多結(jié)構(gòu)、API函數(shù),將在第13章節(jié)詳細(xì)介紹。2.2.5 網(wǎng)絡(luò)用戶用WindowsPI可以開發(fā)基于各種網(wǎng)絡(luò)協(xié)議的應(yīng)用程序,例如TCP\UDPSocket、HTTPDHCP、RPC、QOS、藍(lán)牙,以及傳真、點(diǎn)對(duì)點(diǎn)文件傳輸、即插即用設(shè)備管理等。還可進(jìn)行網(wǎng)絡(luò)管理包括網(wǎng)絡(luò)的基本信息使用IPelper獲取網(wǎng)配置和網(wǎng)絡(luò)信息、進(jìn)行網(wǎng)絡(luò)監(jiān)視等。同時(shí)軟還提供了進(jìn)行網(wǎng)絡(luò)安全編程的部分接口主要是防火墻Windows防墻API,以及一些Windows自帶的網(wǎng)絡(luò)應(yīng)用程序的接口,包括IE、Outlook等。本書第14章將詳細(xì)紹網(wǎng)絡(luò)程序設(shè)計(jì)的相關(guān)內(nèi)容。2.2.6 系統(tǒng)安全包括統(tǒng)的授權(quán)與認(rèn)證登錄權(quán)限管理加密安全管理策略等內(nèi)容本書將主要介紹用戶管(包括用戶增加修改設(shè)置刪除等和Windows安全對(duì)(任何具有訪問控制機(jī)制的對(duì)象如文件進(jìn)程和安全操作主(線程之間的安全認(rèn)證機(jī)制及權(quán)限設(shè)置對(duì)程序行為的影響。第17章進(jìn)行了相關(guān)的介紹。2.2.7 其他功能WindowsAPI能實(shí)現(xiàn)的功能還有很多限于篇幅不能全部介紹有一些內(nèi)容本書未涉及,但是WindowsAPI也提了相關(guān)接口。1.?dāng)?shù)據(jù)存儲(chǔ)和訪問、數(shù)據(jù)庫包括軟的“動(dòng)態(tài)數(shù)據(jù)存取組件”技術(shù)(MDAC,包含了ADO、ODBC)OLE數(shù)據(jù)庫、XML標(biāo)準(zhǔn)、微軟XML、可擴(kuò)展存在引擎等多方面內(nèi)容。主要是Windows系統(tǒng)內(nèi)的數(shù)據(jù)庫文件、Windows.統(tǒng)對(duì)數(shù)據(jù)庫的訪問接口等技術(shù)。2.消息與協(xié)作消息協(xié)作大多是Windows系統(tǒng)自帶的一些應(yīng)用程序所提供的開發(fā)接口其中最主要的內(nèi)容“協(xié)作數(shù)據(jù)對(duì)象(CDO)CDO包括了若干種Windows數(shù)據(jù)傳輸?shù)湫蛻?yīng)用包括Mssager(MSN)、郵件SMTP(Outlook)應(yīng)用接等。3.Web開發(fā)IIS(IntemetInformationSerer,互聯(lián)網(wǎng)信息服務(wù))等應(yīng)用程序提供的開發(fā)接口,使用戶可以直接在Windows平臺(tái)上進(jìn)行Web開,開發(fā)的程序運(yùn)行于ns框架下。“數(shù)存在與訪問”“消息與協(xié)作”“Web開發(fā)”等都以歸為COM開發(fā)的范圍內(nèi)。COM是Windows應(yīng)用程序接口的一種具有固定的接口模式大多是Windows系統(tǒng)自帶的應(yīng)用程序所提供的開發(fā)接口的集合。2.3indowsAPI核心DLL在Windows的系統(tǒng)錄中存在著很多的動(dòng)態(tài)鏈接庫文件(DLL文件這些DLL文件中包括了WindowsAPI函數(shù)可執(zhí)行程序DLL將各函數(shù)“導(dǎo)出”這樣應(yīng)用程序就可以到DLL中的函數(shù)地址,當(dāng)應(yīng)用程序調(diào)用WindowsAPI,程序會(huì)運(yùn)行到DLL。API函數(shù)主要存在于幾個(gè)核心的動(dòng)態(tài)連接庫文件中。Keme132.dll是最重要的DLL,Windows系統(tǒng)最主要的系統(tǒng)服務(wù)API函數(shù)都存在于Kerne132.dll中User32.dll主要包括圖形用戶界面中所使用到的一些函數(shù)接口。GDI32.dll中,主要包括Windows圖引擎中的接口函數(shù)。當(dāng)用調(diào)用一個(gè)API時(shí)系統(tǒng)通過程序文件中的導(dǎo)入表結(jié)構(gòu)找到需要調(diào)用的API函數(shù)位于哪個(gè)DLL,確定函數(shù)的地址,以便應(yīng)用程序可以成功調(diào)用API函。2.3.1 Kerne132.dllKeme132.dll包括了系統(tǒng)基本服務(wù)中最基本的API函如文件系統(tǒng)進(jìn)程與線程內(nèi)存管理等。WindowsXPSP2系統(tǒng)中,Keme132.d11有949個(gè)導(dǎo)出函數(shù),例如,CreateFileA、CreateProcessAOpenThredSetFilTime等書將在后續(xù)章節(jié)中通過實(shí)例介紹這些API的使用。2.3.2 User32.dllUser32.dll是Windows圖形用戶界面的主要支持。一些重要的圖形用戶界面函數(shù)由User32.dll函數(shù)導(dǎo)出。WindowsXPSP2系統(tǒng)中,User32.dll有732個(gè)導(dǎo)出函數(shù),例如CreateWindowExW、RgisterClassA等。2.3.3 Gdi32.dllGd132.dll是WindowsGDI應(yīng)用程序設(shè)計(jì)接口Gdi3.dll導(dǎo)出了此相關(guān)的若干函數(shù),如GetTextColor、LineTo、TexOutA等。2.3.4 標(biāo)準(zhǔn)C函數(shù)標(biāo)準(zhǔn)C程序是一種標(biāo)準(zhǔn)任何支持C語言應(yīng)用序開發(fā)的系統(tǒng)都應(yīng)該提供C語言庫函數(shù)的調(diào)用在系統(tǒng)環(huán)境下使用標(biāo)準(zhǔn)C進(jìn)行程序開發(fā)時(shí)用戶所使用的庫函數(shù)實(shí)際上是由操作系統(tǒng)提供的正是由于各個(gè)主流操作系統(tǒng)都提供了一套標(biāo)準(zhǔn)C庫所定義的函數(shù)接口標(biāo)準(zhǔn)C函數(shù)庫才會(huì)有如此廣泛的跨越操作系統(tǒng)平臺(tái)所以C程序仍然依賴于操作系統(tǒng)開發(fā)人員為其實(shí)現(xiàn)接口而C庫函數(shù)的實(shí)現(xiàn)仍然依賴于作系統(tǒng)提供的調(diào)用接口如標(biāo)準(zhǔn)C函數(shù)fopen函數(shù)在Windows系中的實(shí)現(xiàn)就依賴于APICreateFile函數(shù)(CreateFile實(shí)現(xiàn)了文件的創(chuàng)建和打開等操作。Windows系統(tǒng)的C標(biāo)準(zhǔn)庫函數(shù)接口主要存在于crtdll.dll中實(shí)際上C標(biāo)準(zhǔn)函數(shù)庫必須由操作系統(tǒng)為其提供接口,否則使用標(biāo)準(zhǔn)C開發(fā)的程序無法在特定的系統(tǒng)上運(yùn)行。WindowsXPSP2系統(tǒng)中,crtdll.dll有526個(gè)導(dǎo)出函數(shù),如fopen、pintf.strlen等。2.3.5 其他Dll當(dāng)然Windows系統(tǒng)中的DLL件遠(yuǎn)遠(yuǎn)不止這幾個(gè),Windows系統(tǒng)提供了非常豐富而且功能強(qiáng)大的API,上文已經(jīng)介紹了WindowsAPI所主要依賴的幾個(gè)DLL,其的DLL庫件由于過于龐雜就不一一介紹將在后續(xù)的章節(jié)中有所涉及讀者只需要了解調(diào)用WindowsAPI的基本原理就可以了。2.4Unicode和多字節(jié)Windows既可以使用Unicode字符集又可以使用傳統(tǒng)的字符(如多字節(jié)編碼來實(shí)現(xiàn)對(duì)多種語言的支持以適應(yīng)國(guó)際市場(chǎng)的要求與傳統(tǒng)的字符集編碼相比Unicode是世界通用的字符編碼標(biāo)準(zhǔn),使用16位數(shù)據(jù)表示一個(gè)字符,一共可以表示65535種字符,可以包括現(xiàn)代計(jì)算機(jī)中所使用的所有字符,包括各種字母、文字、在出版業(yè)中使用的特殊符號(hào)等。傳統(tǒng)字符集,如WindowsASNI字符集,使用8位數(shù)據(jù)或?qū)⑾噜彽膬蓚€(gè)8位的數(shù)據(jù)組合在一起表示特殊的語言字符。Windows系統(tǒng)采用了ASNI字符的擴(kuò)展方式,如果一個(gè)字節(jié)是負(fù)數(shù)則將其后續(xù)的一個(gè)字節(jié)組合在一起表示一個(gè)字符這種編碼方式的字符集也稱“多字節(jié)”字符集。在Windows系統(tǒng)中,Unicode字符編碼和多字節(jié)字符編碼都可以使用。1.實(shí)例2-4Unicode與多字節(jié)編碼演示本實(shí)演示不同寬度的字符串的初始化,并將字符串輸出進(jìn)行比較。在本實(shí)例中一共使用了3種類型的字符串變量每種類型的字符串變量的初始化是不同的,如表2.2所示。本實(shí)例首先使用“多字節(jié)”方式進(jìn)行編譯可以使用二進(jìn)制編輯器來查看編譯得到的可執(zhí)行文件上例中定義的字符串分別存儲(chǔ)為以下形式使用二進(jìn)制編輯器查看可以從exe可執(zhí)行文件中找到如下信息。讀者可以對(duì)照ASCII碼表查看正好是“ThisisaUnicoeString;”使用Unicode方式的六進(jìn)制編碼。是“ThisisntaUnicodeString;”使用ASCII方式的十進(jìn)制編碼。是符“ThistringsUnicoderntependsontheption.”的ASCI方式的十六進(jìn)制編碼,說明編譯配置沒有使用Unicode。之后是“<字符編碼1>”和Unicode編碼、“<字符編碼2>”和“<字符編碼3>”的多字節(jié)編碼。對(duì)漢字字符,兩種編碼的方式是不同的,如“字符編碼”四個(gè)字,兩種編碼分別為:和讀者可以分析設(shè)置使用Unicode字符集后編譯完成的可執(zhí)行文件與設(shè)置為多字節(jié)字符集后編譯得到的可執(zhí)行文件有什么不同。2.在工程配置中選擇編碼方式設(shè)置方法是在Visualtudio工程屬性中選擇“配置屬性”→“常規(guī)”→“字符集”選項(xiàng)中進(jìn)行選擇。2.4.1 W版本和A版本的APIWindows支持Unicode和ASCII編碼的字符。Windows系統(tǒng)API凡是以字符串為參數(shù)的很多具有W和A兩個(gè)本以實(shí)現(xiàn)兩種不同編碼的字符處理。下面以MessageBox例介紹兩種不同版本API函數(shù)的使用在User32.dll中導(dǎo)出函數(shù)實(shí)際上沒有MessageBox只有MessageBoxA和MessageBoxW這兩者是同一個(gè)API實(shí)現(xiàn)了同樣的功能。不同的是,MessageBoxA以多字節(jié)字符串作為參數(shù)輸入,MessateBoxW以Unicode字符串作為參數(shù)輸入??梢詮腢ser32.dll的導(dǎo)函數(shù)看到兩個(gè)不同版本的API函數(shù)。在PlatformSDK中,MessageBox函數(shù)聲明所在的頭文件中發(fā)現(xiàn)如下定義(以下代碼來自于MicrosoftPlatfomSDK):可以看到在程序行編譯和連接時(shí)如果序在UNICODE環(huán)境下用MessageBoxW,否則使用MessageBoxA。軟件發(fā)人員可以自行設(shè)定使用Unicode編碼或都多字節(jié)編碼文件不影響程序的正常功能。但如果在編寫程序時(shí)使用的字符集與代碼中使用的函數(shù)不一致定義的字符串變量不兼容,將會(huì)引起編譯錯(cuò)誤或者運(yùn)行程序顯示亂碼甚至可能引起程序運(yùn)行錯(cuò)誤這一點(diǎn)需要引起注意。2.4.2 Unicode與ASGII的轉(zhuǎn)換Windows專門提供了若干個(gè)API來實(shí)現(xiàn)對(duì)字符編碼的轉(zhuǎn)換工作WieCharToMultiByte、MultiByteToWideCharUnicodeToBytes函數(shù)可以完成這工作。WideCharToMultiByte函數(shù)將Unicode字符轉(zhuǎn)換多字節(jié)字符串,以適應(yīng)A本的API,MultiByteToWideChar函數(shù)將字節(jié)字符串轉(zhuǎn)換為了Unicode字符,以適應(yīng)W版本的API的參數(shù)形式要。2.5對(duì)Windows程序設(shè)計(jì)規(guī)范的建議每個(gè)序員都有自己的規(guī)范化編程習(xí)慣代碼的規(guī)范不是本書的重點(diǎn)所以這里只給出一些微軟經(jīng)常使用代碼規(guī)范MSDN的示例中SDK的頭文件和例子中幾乎都是使用的這種方法。變量名:通常采用所謂的“匈牙利命名法”,變量名由“類型縮寫(小寫)”+“變量描述(單詞首字母大寫”構(gòu)成,如符串類型的變量可以命名為szFileName,DWORD類型的數(shù)據(jù)可以命名為dwFileSize,指類型可以命名為lpBuffer,句柄類型的變量可以命名為hLogFile等。函數(shù):各單詞的首字母大寫,如EnumerateFilesInDrectory、SowFileSize等。類型:全大寫,各單詞以下劃線分隔,如WIN32_FILE_ATTRIBUTE_DATA、DWORD、HANDLE等。常量同類型名的命名方式。宏:與類型名命名方式相同,有的也與函數(shù)名命名方式相同。大括與代碼段一般大括號(hào)獨(dú)立占一行大括號(hào)內(nèi)的代碼段縮進(jìn)如果代碼段僅一行(如if-else后的語句,也建議使用大括號(hào)。在調(diào)用或定義函數(shù)時(shí),如果函數(shù)太長(zhǎng),可以分行寫,將每個(gè)參數(shù)寫一行。一般多于3個(gè)參數(shù)的函數(shù)需要分行寫,以美觀和方便閱讀為原則。在本的示例中,都將盡量使用這些規(guī)范化的方式。第3章開發(fā)工具配置與使用程序的發(fā)依賴于開發(fā)工具。WindowsAPI函數(shù)是C語言形式的,并且Windows本機(jī)應(yīng)用程序絕大多數(shù)是使用C或者C++語言開發(fā)的因此C\C++編譯器和鏈接器等程序生成工具是程序開發(fā)必備的工具。VisualC和VisualC++是Windows平臺(tái)下完整的C和C++程序生成工具。PlatformSDK提供了使用WindowsAPI所需的頭文件和庫文件,同時(shí)也提供了部分工具本章將講解如何使用這些程序構(gòu)造工具以及如何使用微軟提供的頭文件與庫文件來構(gòu)造Windows應(yīng)用程序。大型程序一般有很多代碼文件使用nmake工具可以批量構(gòu)造程序使開發(fā)人員無需對(duì)每個(gè)文件逐一進(jìn)行編譯。makefile是nmake工具的配置文件,包含nmake工作需的輸入?yún)?shù)。本章將會(huì)介紹如何使用nmake工具,及如何編寫makefile。此外程序開發(fā)與調(diào)試也密不可分所以調(diào)試器的使用也是本章所關(guān)注的內(nèi)容本章將會(huì)講解WinDbg的使用。另外在實(shí)際的工程開發(fā)中,集成開發(fā)環(huán)境(IDE)可以大大提供代碼編輯的效率和程序構(gòu)建的效率同時(shí)也為開發(fā)過程中代碼的調(diào)試提供了很大的方便本章也會(huì)講解IDE的使用技巧。這些具都可以方便地從微軟的網(wǎng)站上免費(fèi)獲得在開始本章的學(xué)習(xí)前請(qǐng)讀者先按照第1章的方法裝VisualC++(VisulStudio)和PlatformSDK。3.1使用isualC/C++編譯鏈接工具在第1章已經(jīng)介紹了如何安裝Visual++成版和Visualtudio專業(yè)版等開發(fā)工具。VisualC++的安裝目錄(VisualStudi02008的默認(rèn)安裝路徑是C:\ProgramFiles\MicrosoftVisualStud09)下的“VC\bin”目中包含cl.ee、link.exe、lb.exerc.exe等可執(zhí)行文件“VC\Include”目錄中包含stdlib.hstio.h等頭件這些都是標(biāo)準(zhǔn)C頭文件;在“VC\lib”目錄中則包含lib文件和obj文件這些文件在程序編譯和鏈接過程中具有重要作用。cl.exe文件是VisualC\C++的編譯器,它將程序源代碼文件編譯為obj文件。rc.exe文件是資源編譯器。工程項(xiàng)目中的.rc文件中包含了對(duì)程序中所使用資源(菜單圖標(biāo)等的描述rc.exe將c格式的文件編譯為.res文件供鏈接器鏈接到可執(zhí)行文件中。link.exe是Windows平臺(tái)的鏈接器它將cl.exe編譯生成的obj文件資源編譯器生成的.res文件,以及l(fā)ib目錄下的lib文件等鏈接成可執(zhí)行的exe文件、dll文件等。3.1.1 編譯器cl.execl.exe的功能是將源代碼文件編譯為可供鏈接器使用的obj對(duì)象文件。cl.exe命令行參數(shù)形式如下:1.命令行參數(shù)各命令行參數(shù)的意義如下。(1)命令行中的“option”是指一個(gè)或多個(gè)編譯選項(xiàng)。在指定選項(xiàng)時(shí),需要在選項(xiàng)前加正斜杠(/)或一個(gè)短劃(_有一些選項(xiàng)還會(huì)帶有參數(shù)使用“”來指定選項(xiàng)的參數(shù)比如“/sybsytem:windows,5.0”是一個(gè)編譯選項(xiàng),表示可執(zhí)行程序執(zhí)行所依賴的子系統(tǒng)是Windows(Win32圖形用戶界面的應(yīng)程序),版最低5.0Winows2000)。選項(xiàng)名區(qū)分大小寫(/HELP選項(xiàng)除外)。而且除了llink選項(xiàng)之其他選項(xiàng)的順序沒有要求在編譯時(shí)所指定的所有選項(xiàng)都將應(yīng)用于用戶指定的所有源文件。option命令行參數(shù)是可選的。(2)命行中的“file”是一個(gè)多個(gè)所需要編譯的源文件也可以是.obj文件或庫文件cl.exe編譯源文件并將.obj件和庫的名稱傳遞給鏈接器file參數(shù)是編譯器的必需參數(shù)。(3)“l(fā)ib”選項(xiàng)用于指定一個(gè)或多個(gè)庫名cl.exe直接將這些名稱傳遞給鏈接器lib是cl.exe可選參數(shù)。(4)“command-file”,包含多個(gè)選項(xiàng)和文件名的文件,為可選參數(shù)。(5)“l(fā)ink-opt”一個(gè)或多個(gè)鏈接器選項(xiàng)CL將這些選項(xiàng)傳遞給鏈接器也是可選參數(shù)。本書第1章的實(shí)例1-1中,已經(jīng)使用了cl.exe來編譯文件。在編譯start.c源文所使用的cl.exe命令行如下:其中“c-DCRTAPIl=cdecl-DCRTAPI2=cdel-nologo-GS-D_X86=1-DWIN32-DWIN32-W3-_vmNT-D_WIN32INNT=Ox0500D_WIN32E=Ox0500-DWINVR=Ox0500DMT-MTd/Gz/Fo"STRTBIN\\"/Fd"STARTBJN\\""是編譯選項(xiàng)(option數(shù)“tart.c”是源文件(file參數(shù))。有使用lib、comand-file、link-opt等命令行參數(shù)。2.編譯器選項(xiàng)option參數(shù)是cl.exe的編譯選是cl.exe命令行參數(shù)中最復(fù)雜也是最常使用的。下面將介紹一些常用的編譯選項(xiàng)。(1)與碼生成有關(guān)的選項(xiàng)如表3.1所這選項(xiàng)將影響編譯完成后生成的機(jī)器代碼。(2)與調(diào)試有關(guān)的編譯選項(xiàng)如表3.2所示。/27、/Zi/ZI這3個(gè)選項(xiàng)是對(duì)程序進(jìn)行調(diào)試時(shí)所必須的選項(xiàng)。同時(shí)注意,在生成調(diào)試版本的程序時(shí),需要指定/Od選項(xiàng)以用優(yōu)化。(3)與程序化有關(guān)的選項(xiàng)如表3.3所示。優(yōu)化選項(xiàng)將影響編譯器對(duì)代碼的優(yōu)化,是選擇代碼體積最小還是選擇運(yùn)行速度最快等需要使用這些選項(xiàng)。(4)與生成輸出文件有關(guān)的選項(xiàng)如表3.4所。輸入文件在參數(shù)中需要使用字符串來指定其路徑字符串使用雙引號(hào)"")擴(kuò)起來/fd"BIN\\"注意字符串的轉(zhuǎn)意字符如果需要使用所斜扛表示文件路徑,需要使用"\\"。(5)與預(yù)處理器有關(guān)的選項(xiàng)如表3.5所示。這些選項(xiàng)將影響預(yù)處理器的運(yùn)行,比如通i出D選項(xiàng)以達(dá)到與在源代碼中使用#define定義基本相同的效果。(6)與接有關(guān)的選項(xiàng)如表3.6所示編譯器可以調(diào)用鏈接器向鏈接器傳遞調(diào)用參數(shù)。/link選項(xiàng)完成這項(xiàng)功能,還可以指定堆棧的大小,創(chuàng)建動(dòng)態(tài)鏈接庫等。(7)與預(yù)編有關(guān)的選項(xiàng)如表3.7示,表3.7中的編譯器選項(xiàng)會(huì)影響預(yù)編譯結(jié)果。(8)與程序語言有關(guān)的選項(xiàng)在表3.8中詳細(xì)列出比如/vmb/vmg選項(xiàng)將影響編譯器對(duì)類成員指針的處理方法;/vmm、/vms、/vmv將會(huì)影響類成員繼承方式;/Za、/Ze選項(xiàng)表示是否支持微軟的語言擴(kuò)展,還是只支持標(biāo)準(zhǔn)C/C++。/Zp選可以指定結(jié)構(gòu)中的成員對(duì)齊方式這將影響到生成的程序中結(jié)構(gòu)體的大小在一些協(xié)議頭的處理中/Zp選項(xiàng)將非常有用。(9)其他選項(xiàng)。這些選項(xiàng)的影響是多方面的,不太好分類。包括顯示幫助信息、設(shè)置警告等級(jí)、設(shè)置版本信息等,詳細(xì)說明見表3.9。表3.1~表3.9包括了大多數(shù)VC/C++編譯器選項(xiàng)是開發(fā)人員在進(jìn)行程序開發(fā)時(shí)最經(jīng)常使用到的選項(xiàng)但是這并不是全部編譯選項(xiàng)如果讀者需要使用到其他的編譯選項(xiàng)可以查閱MSDN。3.1.2 資源編譯器c.exeWindows應(yīng)用程序中圖標(biāo)菜單位圖等是以資源的形式存在的開發(fā)人員也可以自己定義資源類型如果一個(gè)程序使用了資源那么它在構(gòu)建時(shí)需要對(duì)資源進(jìn)行編譯程序所使用的資源會(huì)在資源腳本文件(rc)中進(jìn)行描述編譯時(shí)資源編譯器會(huì)將rc文編譯為可鏈接的.res文件。資源腳本文件中描述了資源的類型、名稱、文件名等信息。資源中可以包括對(duì)話框字符串圖標(biāo)位圖鼠標(biāo)指針樣式工具條等資源文件中大多和圖形用戶界面有關(guān),本書將在第9章中介紹源腳本文件的格式。1.命令行參數(shù)使用如下方式在命令行中運(yùn)行rc.exeoptions是編譯選項(xiàng)。script-file是需要編譯的資源腳本文件。用戶可以使用如下方式調(diào)用:2.資源編譯器選項(xiàng)rc.exe可使用的選項(xiàng)如表3.10所。實(shí)例3-1一個(gè)使用rc.exe進(jìn)行資源腳本文編譯的命令行實(shí)例。3.實(shí)例3-1編譯資源start.rc以下是start.rc文件內(nèi)容。打開“VisualStudio命令提示”,切到start.rc所在的目錄,運(yùn)行:將會(huì)在屏幕上有如下輸出:編譯完成后會(huì)在目錄下生成start.res文件就是編譯完成生成的可供鏈接器使用的資源文件。在程序鏈接時(shí),會(huì)使用到此文件。3.1.3 鏈接器link.exe在程序編譯完成后,生成的文件是以obj為擴(kuò)展名的對(duì)象文件,link.exe將對(duì)象文件和庫鏈接起來以創(chuàng)建可執(zhí)行程序文件或動(dòng)態(tài)鏈接庫文件的工具。link.exe的輸入件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk件。輸出文件是exe文件、dll文件、ss文件可執(zhí)行程序文件。1.命令行參數(shù)link.exe行參數(shù)如下:參數(shù)包括選項(xiàng)和文件名,選項(xiàng)和文件名可按任意順序指定。link會(huì)首先處理選項(xiàng),然后是文件。各參數(shù)間使用一個(gè)或多個(gè)空格或制表符來分隔。2.輸入文件參數(shù)中的files是指鏈接器的輸入文件。用戶可以使用文件名指定絕對(duì)路徑或相對(duì)路徑,可在文件名中使用通配符。如果用戶指定的文件名沒有擴(kuò)展名,則假設(shè)擴(kuò)展名為obj。link.exe對(duì)文件格式的判斷不是根據(jù)文件擴(kuò)展名的,而是判斷文件的內(nèi)容。比如實(shí)例1-1中start.c完成編譯會(huì)生成start.obj文件然后將start.obj與系統(tǒng)庫文件鏈接起來,生成可執(zhí)行文件。命令行參數(shù)為:注意,在實(shí)例1-1中這樣一行代碼:如果在輸入文件中指明了User32.lib,那么這一行是沒有必要的。但如果將這一行代碼去掉,代碼文件中又不包括上面的這一行,則編譯器會(huì)報(bào)錯(cuò)。3.運(yùn)行結(jié)果link.exe返回零值表示成功。如果運(yùn)行成,會(huì)在/out選項(xiàng)指定的輸出路徑中生成可執(zhí)行文件或動(dòng)態(tài)鏈接庫。4.鏈接器選項(xiàng)選項(xiàng)需加“選項(xiàng)說明符(一個(gè)短劃(_或一正斜杠(/))然后是該選項(xiàng)的名稱如果選項(xiàng)帶參數(shù)參數(shù)在冒號(hào)()后指定選項(xiàng)的參數(shù)如果參數(shù)是數(shù)值可以使用十進(jìn)制、或C語言表示法。與編譯器cl.exe不同,鏈接器的選項(xiàng)名及其關(guān)鍵字或文件名參數(shù)不區(qū)分大小寫,但用作參數(shù)的標(biāo)識(shí)符區(qū)分大小寫。常用的link.exe的鏈接選項(xiàng)如表3.11所示。3.1.4 其他工具1.BSCMAKE.EXE生成一個(gè)信息文件(.bsc),用于瀏覽程序中的符號(hào)(類、函數(shù)、數(shù)據(jù)、宏和類型)信息??梢栽诩砷_發(fā)環(huán)境的瀏覽窗中查看這些信息(.bsc文件也可以在IDE中生成。2.LIB.EXE用于生成COFF格的lib庫文件,可用于創(chuàng)建導(dǎo)出文件和引用導(dǎo)出定義的導(dǎo)入庫,在為其他開發(fā)人員提供開發(fā)接口時(shí)非常有用。3.EDITBIN.EXE可用編輯COFF格式的二進(jìn)制文件。4.DUMPBIN.EXE可顯示COFF二進(jìn)制件的有關(guān)信息,比如符號(hào)表等。比如,使用dumpbin.exe分析第1章的start.exe。選擇“工具”→“VisualStudio命令提示”切換到start.exe所在目錄,運(yùn)行:在bin_info.txt中包含可執(zhí)行文件中非常豐富的信息,包括文件頭信息節(jié)信息等。5.NMAKE.EXE程序護(hù)實(shí)用工具,讀取和執(zhí)行生成文件。將在3.3節(jié)中詳細(xì)介紹nmake的使用。6.ERRLOOK.EXE錯(cuò)誤查找工具與GetLastErrorAPI函數(shù)配使用在程序調(diào)試時(shí)起到了很多的作用,用于分析WindowsAPI的調(diào)用錯(cuò)誤。圖3-1示,在VisualStudioIDE中,可以過菜單“工具”→“錯(cuò)誤查找”來使用。3.1.5 編譯鏈接工具依賴的環(huán)境變量1.環(huán)境變量的概念環(huán)境變是一組系統(tǒng)或用戶給應(yīng)用程序設(shè)置的全局性的變量通常用于保存各應(yīng)用程序都會(huì)使用到的系統(tǒng)配置信息。應(yīng)用程序可能會(huì)根據(jù)不同的環(huán)境變量配置產(chǎn)生不同的運(yùn)行結(jié)果。操作系統(tǒng)啟動(dòng)后,會(huì)專門分配一塊內(nèi)存用于存儲(chǔ)環(huán)境變量。之所以稱之為“變量,是因?yàn)槠渲凳强梢愿淖兊南到y(tǒng)上所有運(yùn)行的程序都可以獲取或設(shè)置環(huán)境變量進(jìn)程創(chuàng)建時(shí)進(jìn)程可以獲取系統(tǒng)環(huán)境和當(dāng)前登錄用戶的環(huán)境變量每個(gè)進(jìn)程也可以有自己私有的環(huán)境變量因此環(huán)境變量類似于一種在整個(gè)系統(tǒng)范圍內(nèi)“全局

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論