2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 Windows應(yīng)用程序 編程接口,教學(xué)要點 本章內(nèi)容主要包括API的概念及分類,從API的使用看操作系統(tǒng)所提供的服務(wù),操作系統(tǒng)內(nèi)核中的文件操作API的使用,網(wǎng)絡(luò)服務(wù)API函數(shù)的使用,利用圖形設(shè)備接口API編寫圖形用戶界面程序的方法。 要求了解API的分類及其對應(yīng)的磁盤上的物理文件.DLL的名稱、網(wǎng)絡(luò)服務(wù)API的含義和網(wǎng)絡(luò)編程的一些基本概念、進(jìn)程概念及建立新進(jìn)程的方法、WM_PAINT消息含義。握握AP

2、I概念和其與操作系統(tǒng)提供的程序員接口的關(guān)系、內(nèi)核中文件操作API的調(diào)用,熟悉API編寫圖形用戶界面程序的步驟,熟練掌握API編寫的圖形用戶界面程序的主要組成模塊及含義。,,第5章 目錄,5.1 API概述5.2 內(nèi)核服務(wù)API函數(shù)的使用5.3 網(wǎng)絡(luò)接口服務(wù)5.4 Win32 API編寫圖形界面程序5.5 圖形設(shè)備接口與用戶接口服務(wù) 習(xí)題,本章以一些API設(shè)計的控制臺程序和具有圖形界面的Win32程

3、序為例,闡述了利用API函數(shù)開發(fā)程序的過程,重點在于理解操作系統(tǒng)所提供的各種服務(wù)以及程序員如何進(jìn)行調(diào)用。,,,,,,,,5.1 API概述,5.1.1 關(guān)于WindowsAPI編程模式5.1.2 API簡介5.1.3 Windows核心——三個動態(tài)鏈接庫5.1.4 Windows API分類*5.1.5操作系統(tǒng)的認(rèn)識,,,,,,,Windows API編程是一種原始的開發(fā)Windows應(yīng)用程序模式,它主要使用的是C

4、語言、少量的C++通用類及“原始”的Windows應(yīng)用程序編程接口API(Application Programming Interface) 。這些函數(shù)都是比較底層的函數(shù),其地位大致相當(dāng)于字符界面環(huán)境下C語言的標(biāo)準(zhǔn)庫函數(shù),只不過其運行環(huán)境為Windows的圖形界面環(huán)境。 本篇的后多半部分雖然采用的是相對比較簡單的MFC編程,但使用底層的API函數(shù)編寫程序可以看到許多MFC編程看不到的東西,從而對Windows的內(nèi)部運作有更深入

5、的了解。進(jìn)行API編程,要求用戶對Windows環(huán)境比較熟悉,并且熟悉C語言。在API編程中用到大量的有關(guān)操作系統(tǒng)的結(jié)構(gòu)體變量和控制操作系統(tǒng)的函數(shù),當(dāng)在使用API函數(shù)遇到問題時,可以隨時查閱Windows 的API文檔,它位于MSDN的Platform SDK部分。,5.1.1 關(guān)于WindowsAPI編程模式,,Windows操作系統(tǒng)向程序員提供了可以實現(xiàn)開啟窗口、繪制圖形,使用系統(tǒng)各種設(shè)備等的一組函數(shù)服務(wù),稱之為Applicatio

6、n Programming Interface(應(yīng)用程序編程接口),即API函數(shù)。 利用VC進(jìn)行Windows應(yīng)用程序的開發(fā),除了用到各種.h頭文件中的庫函數(shù)及數(shù)據(jù)結(jié)構(gòu)外,還需要使用Windows SDK(Software Development Kit,軟件開發(fā)工具包)提供的使用于Windows應(yīng)用程序的特殊庫函數(shù)和數(shù)據(jù)結(jié)構(gòu)、語句、文件結(jié)構(gòu)。所有這些內(nèi)容組成了Windows應(yīng)用程序設(shè)計接口API。 使用Win32 AP

7、I,應(yīng)用程序可以充分挖掘出Windows 32位操作系統(tǒng)的潛力,Microsoft的所有32位平臺都支持統(tǒng)一的API,包括函數(shù)、結(jié)構(gòu)、消息、宏及接口。使用Win32 API,不但可以開發(fā)出在各種平臺上都能運行的應(yīng)用程序,而且還可以充分利用每個平臺上特有的功能和屬性。,5.1.2 API簡介,,5.1.3 Windows核心 ——三個動態(tài)鏈接庫,Windows操作系統(tǒng)核心有三個動態(tài)鏈接庫(Kernel32.dll,User32.dl

8、l,Gdi32.dll),這些動態(tài)鏈接庫構(gòu)成了Win32 API函數(shù)。,1.Windows內(nèi)核庫(Kernel32.dll) 內(nèi)核庫中的函數(shù)用于處理操作系統(tǒng)功能的所有核心工作,例如多任務(wù)管理、內(nèi)存管理等。另外內(nèi)核庫還管理系統(tǒng)注冊表。2.Windows用戶界面管理庫(User32.dll) 用戶界面管理庫包括了Windows管理、菜單、光標(biāo)、定時器和通信等有關(guān)的函數(shù)。在Windows中,窗口的標(biāo)識被稱為“句柄”。3.Win

9、dows圖形設(shè)備界面庫(Gdi32.dll) 圖形設(shè)備界面庫提供了用于管理系統(tǒng)支持的所有圖形設(shè)備函數(shù),包括屏幕、打印機等設(shè)備的管理。GDI庫中的函數(shù)為應(yīng)用程序提供與設(shè)備無關(guān)的繪圖內(nèi)容。應(yīng)用程序中通過GDI庫中的函數(shù)繪圖,不是直接面向硬件操作,而是通過“設(shè)備描述表”來進(jìn)行操作,它通過句柄hDC來跟蹤。,Windows三個核心庫中的API函數(shù)的原型聲名在windows.h中有說明,這就是我們在編寫Win32應(yīng)用程序時要在程序開頭放#i

10、nclude “windows.h”語句的原因。,,5.1.4 Windows API分類,根據(jù)Windows API函數(shù)完成的功能,可以將其分為如下的類別:,1.內(nèi)核服務(wù) 通過內(nèi)核服務(wù)函數(shù),應(yīng)用程序可以使用計算機中的資源和操作系統(tǒng)的特性,例如內(nèi)存,文件系統(tǒng)、設(shè)備、進(jìn)程、線程等。拿一個簡單的文件輸入輸出函數(shù)來說,通過這些函數(shù),程序員可以存取本地計算機或網(wǎng)絡(luò)中某臺計算機中的文件、目錄、輸入輸出設(shè)備,并且這些文件函數(shù)支持各種各樣的

11、文件系統(tǒng),包括FAT、NTFS的文件系統(tǒng)。 內(nèi)核服務(wù)體現(xiàn)了Windows操作系統(tǒng)“服務(wù)”的觀點。作為一個程序員我們應(yīng)該利用這些服務(wù)函數(shù)來充分發(fā)揮操作系統(tǒng)的功能。對于這部分API函數(shù)的使用,我們可以在基于控制臺的應(yīng)用程序中編寫,因為這些函數(shù)都是一些與Windows圖形用戶界面無關(guān)的,在字符方式下操作比較簡單。后面有關(guān)這方面函數(shù)的操作就是在基于控制臺的應(yīng)用程序中使用的。 內(nèi)核服務(wù)的函數(shù)大部分包含在Windows內(nèi)核庫—

12、—Kernel32.dll中。,,,5.1.4 WindowsAPI分類(續(xù)),2.圖形設(shè)備接口 圖形設(shè)備接口是Windows最原始的圖形輸出庫(最原始意味著除了GDI外,還有工業(yè)界用的OpenGl和游戲界用的DirectX,VC都對他們提供支持)。當(dāng)看到圖形或文本顯示在屏幕上時,這就是GDI的功勞。它提供了在顯示器、打印機或其它設(shè)備上生成圖形的函數(shù)與相關(guān)的數(shù)據(jù)結(jié)構(gòu)。利用GDI函數(shù),你可以畫直線、曲線、文本、位圖等。你還可以使用各

13、種各樣的繪圖對象如筆、畫刷、字體等,使得所繪制的圖形更加豐富多彩。另外,Windows本身也是通過GDI來繪制其用戶界面,包括窗口、菜單和對話框。 顧名思義,圖形設(shè)備接口是與圖形界面有關(guān)的,因此這些函數(shù)的使用要在圖形用戶界面下操作。即必須建立基于Win32的應(yīng)用程序,建立的步驟如4.4節(jié)所示。 圖形設(shè)備接口的函數(shù)是包含在Windows圖形設(shè)備界面庫——Gdi32.dll中。,,,5.1.4 Windows AP

14、I分類(續(xù)),3.用戶接口服務(wù) 用戶接口服務(wù)函數(shù)可以創(chuàng)建和使用Windows來顯示輸出、提示用戶輸入和執(zhí)行與用戶交互的任務(wù)。用戶接口服務(wù)是通過一些常見的Windows對象來實現(xiàn)的,例如按鈕、組合框、編輯框、菜單、鍵盤輸入、定時器等。 用戶接口服務(wù)的函數(shù)是在Windows用戶界面管理庫——User32.dll中。4.網(wǎng)絡(luò)服務(wù) 網(wǎng)絡(luò)服務(wù)允許分布在網(wǎng)絡(luò)中不同計算機上的應(yīng)用程序進(jìn)行通訊。通過這些函數(shù)可以創(chuàng)建

15、和管理共享資源,例如共享目錄和網(wǎng)絡(luò)打印機。 網(wǎng)絡(luò)服務(wù)的函數(shù)是在網(wǎng)絡(luò)接口函數(shù)庫——Mpr.dll、Wininet.dll和Winsock32.dll中。5.多媒體服務(wù) 多媒體技術(shù)是指利用計算機綜合處理多媒體信息——文本、圖形、圖象和聲音等,使多種信息建立邏輯連接,集成為一個系統(tǒng)并具有交互性。多媒體服務(wù)提供了數(shù)字音頻、視頻、圖形、圖象等服務(wù)。 該服務(wù)的函數(shù)主要包含在多媒體函數(shù)庫——Winmm.dll中。,,

16、,5.1.4 WindowsAPI分類(續(xù)),6.客戶/服務(wù)方式存取服務(wù) 在客戶/服務(wù)方式存取模式中,客戶可以連接到服務(wù)器上以使用服務(wù)器的功能和數(shù)據(jù),服務(wù)器通過客戶端的標(biāo)識和權(quán)限來決定客戶端可以使用的功能。Win2K提供了一套函數(shù)來限制和允許客戶端對服務(wù)端的訪問。這些函數(shù)擴展了Win2k的存取控制模型來使用服務(wù)端的私有對象和使用服務(wù)端的功能??蛻?服務(wù)方式存取服務(wù)又稱操作系統(tǒng)高級編程接口,這些函數(shù)包含在高級編程接口函數(shù)庫——

17、Advapi32.dll中。7.版本服務(wù) 版本服務(wù)主要提供有關(guān)文件的版本信息。這些服務(wù)所對應(yīng)的函數(shù)包含在版本函數(shù)庫——Version.dll中。8.公共對話框服務(wù) 公共對話框,又叫通用對話框,是Windows預(yù)定義的對話框,可以使用通用對話框來執(zhí)行六種標(biāo)準(zhǔn)操作,選擇文件,指定字體、選擇顏色、打印設(shè)置、查找文本、保存文件。這些服務(wù)所對應(yīng)的函數(shù)包含在公共對話框函數(shù)庫——Comdlg32.dll中。,,,5.1.

18、4 WindowsAPI分類(續(xù)),9.打印管理服務(wù) 在Windows操作系統(tǒng)下,可以實現(xiàn)在各種設(shè)備下的打印。打印管理服務(wù)提供了完整的函數(shù)集支持這些操作,例如檢索打印機,準(zhǔn)備打印等。這些服務(wù)所對應(yīng)的函數(shù)包含在打印管理函數(shù)庫——Winspool.drv中。10.解/壓縮文件服務(wù) 該服務(wù)提供了對文件的壓縮和解壓服務(wù)。這些服務(wù)所對應(yīng)的函數(shù)包含在函數(shù)庫——Lz32.dll。 在VC6.0中提供了一個文件Win

19、32api.csv。它是一個Win16與Win32函數(shù)的對照表。通過它,讀者可以瀏覽到Windows各種版本下API函數(shù)的原型說明。,,5.1.5 操作系統(tǒng)的認(rèn)識,操作系統(tǒng)有兩個接口:一個是用戶接口,另一個是程序員接口。 VC開發(fā)工具的強大,其中很重要的一個方面就是對于Windows API的直接調(diào)用,其它任何開發(fā)工具中的函數(shù)都是對其的一個封裝。凡是在Windows工作環(huán)境下執(zhí)行的應(yīng)用程序,都可以通過某種特定方式調(diào)用Woi

20、ndows API函數(shù)??梢院敛豢鋸埖卣f,Windows API函數(shù)是構(gòu)建整個Windows框架的基石,在它下面是Windows操作系統(tǒng)核心,在它上面則是所有華麗的Windows應(yīng)用程序。 事實上,任何開發(fā)工具提供的類庫和構(gòu)件都是架構(gòu)在Win32 API函數(shù)基礎(chǔ)上,是封裝了的API函數(shù)集合。這些類庫和構(gòu)件簡化了程序的開發(fā),但其功能有限。在實際應(yīng)用中,如果我們希望開發(fā)出更靈活、更實用、更具效率的程序時,則必須要涉及直接使用A

21、PI函數(shù)。雖然類庫和構(gòu)件使應(yīng)用程序的開發(fā)簡單了,但它們只提供Windows的常用的一般功能,對于比較復(fù)雜和特殊的功能來說,使用類庫和構(gòu)件中提供的方法是非常難以實現(xiàn)的,這時就需要直接調(diào)用特定的API函數(shù)。,,5.2 內(nèi)核服務(wù)API函數(shù)的使用,內(nèi)核服務(wù)是最能體現(xiàn)API函數(shù)威力的地方,通過這些函數(shù),用戶能夠使用操作系統(tǒng)內(nèi)核所提供的核心功能。操作系統(tǒng)的進(jìn)程管理、文件管理、內(nèi)存管理都是屬于內(nèi)核的功能。,5.2.1 文件管理內(nèi)核服務(wù)5.2

22、.2 進(jìn)程操作5.2.3 計算機系統(tǒng)信息操作,,,,,VC下提供了對文件操作的四種方式:(1)使用C語言中的fopen()、fprintf()、fread()等基本的函數(shù)進(jìn)行文件操作;(2)使用C++中的流式文件接口fstream中的函數(shù)進(jìn)行操作;(3)使用面向?qū)ο蟮念怌File進(jìn)行操作;(4)使用有關(guān)的文件API進(jìn)行操作。,5.2.1 文件管理內(nèi)核服務(wù),,,1.文件操作 2.驅(qū)動器操作,,API為一般的

23、文件操作提供了三個函數(shù):移動、復(fù)制和刪除。文件拷貝的API函數(shù)如下所示:BOOL CopyFile( //從源文件向目標(biāo)文件復(fù)制內(nèi)容 LPCTSTR lpExistingFileName, // 源文件名稱 LPCTSTR lpNewFileName, // 目標(biāo)文件名稱 BOOL bFailIfExists //目標(biāo)文件存在時的操作模式,為true時,函數(shù)調(diào)用失敗,為False //時,現(xiàn)有文件將被

24、覆蓋); 文件移動和文件刪除的API函數(shù)是MoveFileEx()和DeleteFile()【例5-1】調(diào)用API函數(shù)CopyFile實現(xiàn)文件拷貝實例。Windows的內(nèi)核功能的實現(xiàn)不一定要在Windows的圖形界面下完成,在字符方式下也可以。由于目前Windows圖形用戶接口程序的開發(fā)還沒有講(5.4節(jié)和5.5節(jié)中講),并且我們目前掌握的重點是利用API函數(shù)實現(xiàn)Windows內(nèi)核功能的演示,所以下面的程序仍然是字符界面下的單文件控

25、制臺工程,該程序的主文件的名稱為FileCopy.cpp。,1.文件操作,,,#include // windows操作系統(tǒng)API函數(shù)的頭文件#include void main(){char SourceFileName[MAX_PATH];char DestFileName[MAX_PATH];BOOL Success;cout>SourceFileName; cout>DestFileN

26、ame; Success=CopyFile(SourceFileName,DestFileName,TRUE); //調(diào)用API函數(shù)CopyFile實現(xiàn)文件拷貝if (!Success)cout<<"拷貝失敗,錯誤的代碼為:" <<GetLastError()<<endl;//調(diào)用API函數(shù)GetLastError()求出錯的代碼elsecout&l

27、t;<"文件拷貝成功\n";}文件移動和文件刪除的API函數(shù)是MoveFileEx()和DeleteFile(),詳細(xì)請查看MSDN的說明。,程序,,(1)取驅(qū)動器個數(shù)計算機上一般都有軟盤、硬盤和光盤,有時候應(yīng)用程序需要查看系統(tǒng)中一共有多少個邏輯驅(qū)動器,這時可以調(diào)用API函數(shù)GetLogicalDrives()來完成。其函數(shù)的原型為:DWORD GetLogicalDrives(VOID);

28、該函數(shù)返回一個DWORD類型的值,這32位的每一位代表某個驅(qū)動器是否存在。如果存在A盤,則第0位被設(shè)置為1;依次類推,如果存在C盤,則第2位被設(shè)置為1。當(dāng)我們需要知道在該計算機上總共有幾個驅(qū)動器時,可以用如下的代碼完成: DWORD DiskInfo; _int8 DiskCount=0; //定義8位的整型變量 DiskInfo=GetLogicalDrives(); while(DiskInfo)

29、 { if(DiskInfo&1) //看該位是否為1,為1代表有對應(yīng)的驅(qū)動器 DiskCount++; DiskInfo>>=1; } cout<<"該機器共有"<<DiskCount<<"個邏輯驅(qū)動器";,2.驅(qū)動器操作,,,(2)取所有驅(qū)動器字符串信息取所有驅(qū)動器字符串信息通過API函數(shù)GetLogicalD

30、riveStrings()來完成,其原型為:DWORD GetLogicalDriveStrings( DWORD nBufferLength, // 緩沖區(qū)的長度 LPTSTR lpBuffer // 指向所有驅(qū)動器字符串的指針);使用該函數(shù)一般分兩個步驟:①求所有驅(qū)動器的字符串信息長度把0傳遞給API函數(shù)GetLogicalDriveStrings()的兩個形參,函數(shù)的返回值就是所有驅(qū)動器的字符串信息長

31、度。語句為:DriveStringLength=GetLogicalDriveStrings(0, NULL);② 動態(tài)分配內(nèi)存空間保存所有驅(qū)動器的字符串信息通過new函數(shù)在棧區(qū)申請內(nèi)存于字符指針變量DriverStr,然后把上一步求的所有驅(qū)動器的字符串信息長度DriveStringLength和準(zhǔn)備保存所有驅(qū)動器的字符串緩沖區(qū)地址DriverStr傳遞給API函數(shù)GetLogicalDriveStrings()的兩個形參,,2.

32、驅(qū)動器操作(續(xù)),,,,這樣求得的所有驅(qū)動器的字符串信息就保存到緩沖區(qū)DriverStr中,注意每個驅(qū)動器字符串的長度為4,假設(shè)該機器有A、B、C、D四個驅(qū)動器則在緩沖區(qū)DriverStr保存的內(nèi)容是A:\B:\ C:\D:\,其中表示的是空字符,各個驅(qū)動器之間靠來分隔,最后以結(jié)束。典型的代碼為:DriverStr=new char[DriveStringLength+1];GetLogicalDriveStrings(DriveS

33、tringLength,(LPTSTR)DriverStr);③ 取驅(qū)動器類型 倘若還要知道每個驅(qū)動器標(biāo)識符各代表什么類型的驅(qū)動器時,如A:代表軟盤還是硬盤,F(xiàn):代表光盤還是U盤(可移動盤),就要使用API函數(shù)GetDriveType(),該函數(shù)的原型為:UINT GetDriveType( LPCTSTR lpRootPathName // 驅(qū)動器的根目錄); 函數(shù)返回值為驅(qū)動器的類型,若值為DRIVE_RE

34、MOVABLE,代表的是可移動U盤,若值為DRIVE_FIXED,代表的是固定盤,若值為CDROM,代表的是光盤等。,2.驅(qū)動器操作(續(xù)),,,【例5-2】調(diào)用驅(qū)動器操作API函數(shù)的演示實例,程序主文件為:DrivesInfo.cpp。#include void main(){DWORD DiskInfo;char *DriverStr;UINT type;short DriveStringLength;_i

35、nt8 DiskCount=0; //定義8位的整型變量DiskInfo=GetLogicalDrives(); //取機器上的驅(qū)動器信息于DiskInfowhile(DiskInfo) {if(DiskInfo&1) //看該位是否為1,為1代表有對應(yīng)的驅(qū)動器DiskCount++;DiskInfo>>=1;},,,,【例5-2】(續(xù)),cout<<"該機

36、器共有"<<DiskCount<<"個邏輯驅(qū)動器\n";DriveStringLength=GetLogicalDriveStrings(0,NULL);//求整個驅(qū)動器的字符串信息的長度,每個驅(qū)動器字符串的長度為4DriverStr=new char[DriveStringLength+1];GetLogicalDriveStrings(DriveStringLen

37、gth,(LPTSTR)DriverStr);//求整個驅(qū)動器的字符串信息于DriverStr for(short i=0;i<(int)(DriveStringLength/4);i++){type=GetDriveType(DriverStr+i*4); //取驅(qū)動器的類型是軟盤、硬盤、光盤、可移動U盤if(type==DRIVE_CDROM) //如果是光驅(qū)的話cout<<

38、"驅(qū)動器"<<DriverStr+i*4<<"是光驅(qū)\n";}},,Windows是多任務(wù)操作系統(tǒng),它支持兩種類型的多任務(wù):一種是多進(jìn)程,另一種是多線程。進(jìn)程是應(yīng)用程序的運行實例,它是應(yīng)用程序的一次動態(tài)執(zhí)行。所謂的多進(jìn)程就是,Windows允許多個程序同時駐留在內(nèi)存或同一個應(yīng)用程序可以在內(nèi)存中有多個副本。 我們知道,進(jìn)程指獨立運行著的應(yīng)用程序。當(dāng)啟動Word字處理程

39、序,便啟動了一個進(jìn)程。同樣,當(dāng)我們編譯并運行我們自己所編寫的一個VC程序時,也啟動了一個進(jìn)程。下面的例子就要演示在一個控制臺的應(yīng)用程序中,啟動Windows附件中的“記事本”程序,從而啟動一個新的進(jìn)程。1.進(jìn)程的創(chuàng)建Windows以對象的方式來管理進(jìn)程的,它由Win32子系統(tǒng)來創(chuàng)建和維護(hù),并且可以由此進(jìn)程的句柄來進(jìn)行管理。進(jìn)程創(chuàng)建是調(diào)用Win32 API函數(shù)CreateProcess()來實現(xiàn),創(chuàng)建后的進(jìn)程可以和原進(jìn)程共享資源(例如

40、句柄和變量)。在Windows中,這兩個進(jìn)程不存在緊密的父子關(guān)系,即使原進(jìn)程終止后,這個新進(jìn)程仍然可以繼續(xù)執(zhí)行。 2.進(jìn)程創(chuàng)建函數(shù)的原型說明,5.2.2 進(jìn)程操作,,,BOOL CreateProcess(LPCTSTR lpApplicationName, // name of executable moduleLPTSTR lpCommandLine, // command line string

41、LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, // handle inheritance optionDWORD dwCreationFlags, // creation flagsLPVOID lpEnvironment, // ne

42、w environment blockLPCTSTR lpCurrentDirectory, // current directory name LPSTARTUPINFO lpStartupInfo, // startup informationLPPROCESS_INFORMATION lpProcessInformation // process information);3.函數(shù)的參數(shù)說明

43、(1)參數(shù)lpApplicationName 它是一個以NULL結(jié)尾的字符串指針,指向待執(zhí)行的可執(zhí)行文件名字,它可以為全路徑,也可以只是單獨一個文件名。如果只是一個單獨的文件名,則系統(tǒng)會在當(dāng)前路徑下尋找,然后在系統(tǒng)目錄和PATH所指的目錄中去查找。,5.2.2 進(jìn)程操作(續(xù)),,,當(dāng)這個參數(shù)為NULL時,這個文件的名稱必須是第二個參數(shù)lpCommandLine的第一個空格前的字符所代表的文件名。(2)參數(shù)lpCommandLin

44、e 它是一個以NULL結(jié)尾的字符串的指針,指向命令行參數(shù)。參數(shù)lpApplicationName 和參數(shù)lpCommandLine不允許同時空,否則系統(tǒng)找不見新進(jìn)程所對應(yīng)的可執(zhí)行程序的文件名。(3)參數(shù)lpProcessAttributes和參數(shù)lpThreadAttributes 用來確定新進(jìn)程和它的主線程的安全屬性,即用來決定所返回的句柄是否可以被這個新進(jìn)程的子進(jìn)程繼承。它們都是指向SECURITY_ATTRIBUTES結(jié)構(gòu)的

45、指針,若它們?yōu)镹ULL,則不能被繼承。(4)參數(shù)bInheritHandles 用來確定新建進(jìn)程能否繼承產(chǎn)生它的進(jìn)程的句柄。若它的值為TRUE,則這個進(jìn)程和線程所建立的句柄都可以被這個進(jìn)程所建立的新進(jìn)程所繼承,即繼承的句柄和原先的句柄有相同的值和存取權(quán)限。 (5)參數(shù)dwCreationFlags 該參數(shù)決定新進(jìn)程產(chǎn)生的方式,它可以用邏輯或的方式把下列值組合起來:,5.2.2 進(jìn)程操作(續(xù)),,,   C

46、REATE_NEW_CONSOLE 為新進(jìn)程建立一個新的控制臺窗口。DETACHED_PROCESS 在默認(rèn)情況下,新進(jìn)程使用的是父進(jìn)程的控制臺窗口,而如果指明此標(biāo)志,則新進(jìn)程的輸出消息將發(fā)送到新的控制臺窗口。CREATE_NEW_PROCESS_GROUP 這個新進(jìn)程將是一個新進(jìn)程組的根,進(jìn)程組包括該進(jìn)程的所有子進(jìn)程。  CREATE_SUSPENDED 這個新進(jìn)程的主線程在它被創(chuàng)建時處于掛起狀態(tài),即不被執(zhí)

47、行,一直等到調(diào)用ResumeThread()時,主線程才開始執(zhí)行。 DEBUG_PROCESS 如果該標(biāo)志設(shè)置的話,調(diào)用進(jìn)程被當(dāng)作調(diào)試者,新進(jìn)程正準(zhǔn)備接收調(diào)試。系統(tǒng)把在進(jìn)程被調(diào)試時所發(fā)生的調(diào)試事件通知給父進(jìn)程。 參數(shù)lpEnvironment 指向環(huán)境塊內(nèi)存的指針,若該值為NULL,則新進(jìn)程和父進(jìn)程使用相同的環(huán)境塊。 參數(shù)lpCurrentDirectory 新進(jìn)程的工作目錄和驅(qū)動器,若其為NULL,則新進(jìn)程的工作

48、目錄和驅(qū)動器與父進(jìn)程相同。,5.2.2 進(jìn)程操作(續(xù)),,, 參數(shù)lpStartupInfo 這是一個指向STARTUPINFO結(jié)構(gòu)的指針,說明新進(jìn)程以怎樣的形式加以顯示。 參數(shù)lpProcessInformation 一個指向PROCESS_INFORMATION結(jié)構(gòu)的指針,用來存放返回值。如果函數(shù)CreateProcess成功被調(diào)用,則返回TRUE,否則返回FALSE。如果函數(shù)返回FALSE,則可以調(diào)用函數(shù)GetLastErr

49、or取得進(jìn)一步的錯誤信息。【例5-3】調(diào)用Windows內(nèi)核API函數(shù)實現(xiàn)多任務(wù)的執(zhí)行實例。程序的主文件為 :MultiProcess.cpp。 #include "windows.h" #include void main() {char InChar;cout>InChar;if(InChar=='Y'||InChar=='y

50、'){,5.2.2 進(jìn)程操作(續(xù)),,,【例5-3】(續(xù)),BOOL IsSuccess;char NotePadFile[255]; //存放記事本程序的路徑UINT uSize=255; GetWindowsDirectory(NotePadFile,uSize); //調(diào)用API函數(shù)GetWindowsDirectory()取得Windows的系統(tǒng)目錄strcat(NotePadFi

51、le,“\\notepad.exe”); //取得記事本程序的 完整路徑PROCESS_INFORMATION NewProcessInformation; //建立進(jìn)程信息變量NewProcessInformationSTARTUPINFO StartUpInformation; //建立進(jìn)程的啟動信息變量StartUpInformationmemset(&S

52、tartUpInformation,0,sizeof(StartUpInformation)); //將緩沖區(qū)StartUpInformation設(shè)置為0StartUpInformation.cb=sizeof(StartUpInformation);StartUpInformation.wShowWindow=SW_SHOW; //新進(jìn)程的顯示方式為正常顯示StartUpInformation.dwFla

53、gs=STARTF_USESHOWWINDOW;……,,Windows內(nèi)核Kernel32.dll中包含了大量有關(guān)計算機系統(tǒng)的信息。這些信息包括計算機的硬件配置信息、計算機的名稱、用戶的名稱、操作系統(tǒng)的版本信息等。一個應(yīng)用程序的可移植性,往往反映在程序運行時,要檢測當(dāng)前程序運行的外部環(huán)境,其中獲取計算機系統(tǒng)信息是很重要的,Win32 API提供了這些服務(wù)。其中:GetComputerName()可以取得本機器的名稱,GetSyste

54、mInfo()可以取得CPU的信息,GlobalMemoryStatus()可以取得內(nèi)存的狀態(tài)信息,例5-4,5.2.3 計算機系統(tǒng)信息操作,,5.3 網(wǎng)絡(luò)接口服務(wù),當(dāng)今,計算機網(wǎng)絡(luò)的發(fā)展一日千里,就連蜜蜂這個“空姐”找對象時都想找蜘蛛,原因是蜘蛛好賴是一個搞“網(wǎng)絡(luò)”的。隨著因特網(wǎng)“飛入尋常百姓家”,人們對網(wǎng)絡(luò)服務(wù)應(yīng)用程序的要求越來越高,如何開發(fā)網(wǎng)絡(luò)應(yīng)用程序,最基本的是搞清楚Windows操作系統(tǒng)對網(wǎng)絡(luò)的支持,對程序員來說,要掌握網(wǎng)

55、絡(luò)編程的一些概念,最終掌握有關(guān)網(wǎng)絡(luò)使用的一些API函數(shù)。,5.3.1 套接字的使用與Winsock API5.3.2 因特網(wǎng)服務(wù)WinInet,,,,,什么是套接字 套接字(socket)是一種網(wǎng)絡(luò)編程接口,它是對通信端點的一種抽象,提供了一種發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的機制。Winsock是Windows操作系統(tǒng)下的套接字,它是一套Microsoft Windows下的網(wǎng)絡(luò)編程接口,使用該接口可以充分利用Windows消息驅(qū)動機制

56、進(jìn)行編程,在應(yīng)用程序中是通過調(diào)用WinSock API實現(xiàn)相互之間的通訊。,5.3.1 套接字的使用與 Winsock API,,,初始化套接字 在使用Winsock進(jìn)行編程之前,必須對它進(jìn)行初始化,使用WSAStartup()就可以完成。該函數(shù)的原型為:int WSAStartup( WORD wVersionRequested,// Socket動態(tài)鏈接庫的版本號 LPWSADATA lpWSAData //

57、指向一個WSADATA數(shù)據(jù)結(jié)構(gòu), //該數(shù)據(jù)結(jié)構(gòu)返回Windows Socket實現(xiàn)的詳細(xì)信息); 第一個參數(shù)指明了要調(diào)用的Socket動態(tài)鏈接庫的版本號;第二個參數(shù)為指針類型,指向一個WSADATA數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)返回Windows Socket實現(xiàn)的詳細(xì)信息。 該函數(shù)通過一個過程調(diào)用來完成使用Windows中Socket動態(tài)鏈接庫的初始化工作,它調(diào)用成功后就可以調(diào)用Windows Socket API函數(shù)。,5.

58、3.1 套接字的使用與WinsockAPI(續(xù)),,,,,用WinsockAPI函數(shù)取本機名和IP地址 取本機名稱的函數(shù)為: int gethostname( char FAR *name, int namelen ); 其中參數(shù)name為傳出參數(shù),指向接收主機名稱的緩沖區(qū);后面的參數(shù)為傳入?yún)?shù),它指定了緩沖區(qū)的長度。取主機信息的函數(shù)為:struct hostent FAR

59、*gethostbyname( const char FAR *name );該函數(shù)用來通過主機名稱獲取主機的詳細(xì)信息。參數(shù)name就是gethostname()函數(shù)的返回結(jié)果,該函數(shù)執(zhí)行成功后,將返回一個hostent結(jié)構(gòu)的指針,該結(jié)構(gòu)包含了當(dāng)前主機的詳細(xì)信息。該結(jié)構(gòu)定義如下:,5.3.1 套接字的使用與 WinsockAPI(續(xù)),,,struct hostent { char FAR * h_name

60、; //主機的官方名稱 char FAR * FAR * h_aliases;//主機的別名 short h_addrtype; //地址類型 short h_length; //該數(shù)據(jù)結(jié)構(gòu)的大小 char FAR * FAR * h_addr_list; //主機地址列表,包含了主機的IP};【例5-5】調(diào)用Windows網(wǎng)絡(luò)API函數(shù)取計算機的名稱和IP地址。

61、程序主文件為MyComputer.cpp。,例5-5,5.3.1 套接字的使用與WinsockAPI(續(xù)),,WinInet是Windows Internet擴展應(yīng)用程序的接口,它包含了一個C語言的函數(shù)集。使用WinInet可以為應(yīng)用程序添加向InterNet服務(wù)器的連接,而無需考慮基本的通訊協(xié)議和底層的數(shù)據(jù)傳輸工作。WinInet支持文本傳輸協(xié)議(FTP)、超文本傳輸協(xié)議(HTTP)等。 1.利用WinInet檢測計算機是否接入

62、因特網(wǎng)及接入方式 在開發(fā)網(wǎng)絡(luò)應(yīng)用程序的時候,如果設(shè)計到Internet方面的處理問題,則首先必須要能判斷當(dāng)前計算機是否接入Internet。因為,如果用戶當(dāng)前的計算機沒有接入網(wǎng)的話,隨后的任何操作過程都必出現(xiàn)錯誤。我們可以通過軟件的方式檢測當(dāng)前計算機是否接入Internet及當(dāng)前的接入方式。,5.3.2 因特網(wǎng)服務(wù)WinInet,,,2.WinInet中的API函數(shù)InternetGetConnectedState通過API函

63、數(shù)InternetGetConnectedState可以檢測當(dāng)前計算機是否接入Internet及接入的方式。該函數(shù)原型為: BOOL InternetGetConnectedState( OUT LPDWORD lpdwFlags, IN DWORD dwReserved );該函數(shù)第一個參數(shù)表示網(wǎng)絡(luò)的接入類型,第二個值保留,一般取0,當(dāng)函數(shù)返回值為真時,代表已經(jīng)接入因特網(wǎng)。否則,沒有接入。【

64、例5-6】調(diào)用因特網(wǎng)API函數(shù)檢測本機是否接入因特網(wǎng)的實例。程序的主文件為LinkInternet.cpp程序。,例5-6,5.3.2 因特網(wǎng)服務(wù)WinInet(續(xù)),,本章的前幾節(jié)利用API函數(shù)來操縱操作系統(tǒng),編寫的都是控制臺工程,下面講解利用API函數(shù)來編寫圖形界面的程序,它是本節(jié)的重點和難點,讀者要花大力氣去學(xué)習(xí)。,5.4 Win32API編寫圖形界面程序,5.4.1使用AppWizard生成W32應(yīng)用程序5.4.2程

65、序的入口WinMain()5.4.3定義和注冊窗口類5.4.4初始化實例5.4.5維護(hù)消息循環(huán)5.4.6窗口函數(shù)和消息處理5.4.7常見消息的處理5.4.8幾個重要的結(jié)構(gòu)*5.4.9WinMain()執(zhí)行規(guī)程描述*5.4.10利用Win32 API編寫圖形界面的關(guān)鍵,,【例5-7】調(diào)用API函數(shù)建立一個圖形界面的程序Hello。1.建立Hello工程(1)啟動Visual C++的集成開發(fā)環(huán)境Deve

66、loper Studio。(2)選擇菜單命令“File|New|Projects|Win32 Application”。(3)在Project Name的編輯框中輸入一個應(yīng)用程序的名稱“Hello”,界面如圖5.1 所示。完后單擊OK按鈕。進(jìn)入下一個界面,如圖5.2所示。(4)選擇一個Windows應(yīng)用程序的類型——A Typical“ Hello World!” Application。完后單擊Finish按鈕。進(jìn)入下一個界面,

67、單擊OK按鈕,一個應(yīng)用程序已經(jīng)生成。(5)單擊WorkSpace視圖的ClassView標(biāo)簽下Hello Classes根結(jié)點下的子結(jié)點Globals。界面如圖5.3 所示。(6)雙擊WinMain()函數(shù)結(jié)點,進(jìn)入到程序的主文件Hello.cpp文件中。我們的主要工作就是剖析該文件的內(nèi)容。文件的主要內(nèi)容如2小節(jié)所示(作了簡單修改)。2.Hello.cpp的主要內(nèi)容( 詳細(xì)內(nèi)容請參見程序),5.4.1 使用AppWizard生成

68、 Win32應(yīng)用程序,,,圖(一),,,,圖5.1選擇工程類型窗口,圖5.2 選擇win32應(yīng)用程序類型窗口,圖5.3 選擇WinMain函數(shù)的界面,,WinMain()函數(shù)是所有Windows應(yīng)用程序的入口,類似于C語言中的Main()函數(shù),其功能是完成一些初始化工作并維持一個消息循環(huán)。消息循環(huán)是整個程序運行的核心。在WinMain()函數(shù)中,要完成以下幾步工作: 利用自定義函數(shù)MyRegisterCla

69、ss()注冊應(yīng)用程序窗口類 利用自定義函數(shù)InitInstance()初始化應(yīng)用程序的實例,該函數(shù)主要完成創(chuàng)建和顯示窗口,并進(jìn)行其它必要的初始化處理 利用API函數(shù)GetMessage()啟動應(yīng)用程序的消息循環(huán),把從應(yīng)用程序消息隊列接收的消息進(jìn)行翻譯,并送到窗口函數(shù)中進(jìn)行處理 窗口函數(shù)WinProc()是Windows應(yīng)用程序的消息處理中心,它能夠處理所有的消息 當(dāng)消息循環(huán)檢索到WM_QUIT消息時,則退出應(yīng)用程序。

70、如果WinMain()調(diào)用成功,那么將會在接收到WM_QUIT時退出。,,,,,,5.4.2程序的入口WinMain(),,Windows下窗口的生成都是基于窗口類的。每個窗口都有一些基本屬性,如標(biāo)題欄文字、窗口大小和位置、圖標(biāo)、窗體的背景顏色等,窗口類就是充當(dāng)定義這些屬性的模板。 WinMain()函數(shù)中,通常要對主窗口定義一個窗口類,即把窗口類的具體屬性填入WNDCLASSEX結(jié)構(gòu)的相應(yīng)成員中。然后進(jìn)行注冊,它是通過調(diào)用R

溫馨提示

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

評論

0/150

提交評論