




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二十章WinInet介紹.第二十章WinInet介紹.1WinInet(WIN32InternetFunction)是一個(gè)易用的網(wǎng)絡(luò)編程接口,它使程序員在較高層次建立Internet客戶應(yīng)用程序,大大簡(jiǎn)化了編程過(guò)程VisualC++中,可以使用兩種方式進(jìn)行編程,一種是使用MFCWinInet類,另一種是直接使用WinInetAPI函數(shù).WinInet(WIN32InternetFunctio220.1MFCWinInet類WinInet類是對(duì)WinInetAPI的封裝它具有以下功能:使用HTTP協(xié)議將HTML頁(yè)面從服務(wù)器下載到瀏覽器中發(fā)送FTP請(qǐng)求以上載或下載文件,或獲取文件目錄列表使用Gopher獲取網(wǎng)絡(luò)資源使用Gopher、HTTP或者FTP協(xié)議與服務(wù)器建立連接或者斷開(kāi)連接.20.1MFCWinInet類WinInet類是對(duì)Win3WinInet類提供了對(duì)HTTP、FTP等公共Internet協(xié)議的訪問(wèn)方法,它包括CInternetSession、CInternetConnection、CInternetFile、CHttpConnection、CGopherFile、CGopherConnection、CFtpConnection、CFileFind、CFtpFileFind、CGopherFileFind、CGopherLocator、CInternetException等十二個(gè)類.WinInet類提供了對(duì)HTTP、FTP等公共Interne41.WinInet類編程模型使用WinInet進(jìn)行Internet的客戶程序編程過(guò)程非常簡(jiǎn)單,下面簡(jiǎn)要介紹(1)創(chuàng)建CInternetSession類對(duì)象,創(chuàng)建并初始化Internet會(huì)話CInternetSession類的構(gòu)造函數(shù)原型為:.1.WinInet類編程模型使用WinInet進(jìn)行Inte5CInternetSession(LPCTSTRpstrAgent=NULL,DWORDdwContext=1,DWORDdwAccessType=INTERNET_OPEN_TYPE_PRECONFIG,LPCTSTRpstrProxyName=NULL,LPCTSTRpstrProxyBypass=NULL,DWORDdwFlags=0);.CInternetSession.6其中pstrAgent為字符串指針,用于指定調(diào)用Internet函數(shù)的應(yīng)用程序或?qū)嶓w的名字。例如“MicroSoftInternetBrowser”。如果用缺省值NULL,則框架將調(diào)用AfxGetAppName()以返回一個(gè)包含應(yīng)用程序名字并以空字符結(jié)尾的字符串。參數(shù)dwContext用以指定操作的上下文標(biāo)識(shí)符。用戶可以顯式的對(duì)此ID賦值。CInternetSession對(duì)象及其所進(jìn)行的任何工作都將與此ID相聯(lián)系.其中pstrAgent為字符串指針,用于指定調(diào)用Intern7參數(shù)dwAccessType用以指定連接請(qǐng)求的操作類型,可取的值如表所示:INTERNET_OPEN_TYPE_PRECONFIG使用注冊(cè)表中預(yù)定的類型INTERNET_OPEN_TYPE_DIRECT直接連接到InternetINTERNET_OPEN_TYPE_PROXY通過(guò)CERN代理服務(wù)器連接.參數(shù)dwAccessType用以指定連接請(qǐng)求的操作類型,可取8參數(shù)pstrProxyName用于指定首選的CERN代理服務(wù)器參數(shù)pstrProxyBypass用以指定可選的代理服務(wù)器列表,顯然只有程序使用代理服務(wù)器時(shí),此項(xiàng)選擇才有效最后一個(gè)參數(shù)dwFlags用于指定連接的選項(xiàng),可能的意思見(jiàn)下表.參數(shù)pstrProxyName用于指定首選的CERN代理服務(wù)9dwFlags的選項(xiàng)含義INTERNET_FLAG_DONT_CACHE對(duì)于本地或任何網(wǎng)關(guān)服務(wù)器都不緩存數(shù)據(jù)INTERNET_FLAG_ASYNC函數(shù)異步完成INTERNET_FLAG_OFFLINE下載操作只通過(guò)持久的緩存進(jìn)行.dwFlags的選項(xiàng)含義INTERNET_FLAG_DONT10該構(gòu)造函數(shù)調(diào)用了InternetOpen()函數(shù),并返回一個(gè)HINTERNET句柄,此句柄保存在類對(duì)象中;如果沒(méi)有打開(kāi)Internet連接,將產(chǎn)生某種異常。.該構(gòu)造函數(shù)調(diào)用了InternetOpen()函數(shù),并返回一個(gè)11(2)建立CInternetSession對(duì)象與服務(wù)器的連接對(duì)于不同的類型的服務(wù)器(http、ftp和gother)分別有不同的函數(shù)實(shí)現(xiàn)此連接,分述如下:CInternetSession::GetHttpConnection,其原型有兩種,分別為.(2)建立CInternetSession對(duì)象與服務(wù)器的連12CHttpConnection*GetHttpConnection(LPCTSTRpstrServer,INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL);.CHttpConnection*GetHttpConnec13CHttpConnection*GetHttpConnection(LPCTSTRpstrServer,DWORDdwflags,INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL);.CHttpConnection*GetHttpConnec14參數(shù)pstrServer是字符串指針,用以表示服務(wù)器名參數(shù)nPort為TCP/IP端口號(hào)參數(shù)pstrUserName用來(lái)指定用戶名參數(shù)pstrPassword指定密碼參數(shù)dwflags是連接標(biāo)志如果函數(shù)調(diào)用成功,那么函數(shù)返回一個(gè)指向CHttpConnection的指針.參數(shù)pstrServer是字符串指針,用以表示服務(wù)器名.15CFtpConnection*GetFtpConnection(LPCTSTRpstrServer,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL,INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,BOOLbPassive=FALSE);參數(shù)bPassive用以指定FTP會(huì)話的模式,TURE為主動(dòng)模式,F(xiàn)ALSE為被動(dòng)模式.CFtpConnection*GetFtpConnecti16(3)連接時(shí),可以通過(guò)下面函數(shù)查詢或設(shè)置Internet請(qǐng)求選項(xiàng)CInternetSession::QueryOptionBOOLQueryOption(DWORDdwOption,LPVOIDlpBuffer,LPDWORDlpdwBufLen)const;BOOLQueryOption(DWORDdwOption,DWORD&dwValue)const;.(3)連接時(shí),可以通過(guò)下面函數(shù)查詢或設(shè)置Internet請(qǐng)17參數(shù)dwOption用以指定要查詢的Internet選項(xiàng),包括非常多的條目,見(jiàn)MSDN參數(shù)lpBuffer為返回選項(xiàng)設(shè)置的緩沖區(qū)參數(shù)lpdwBufLen用以指定緩沖區(qū)的長(zhǎng)度,但當(dāng)函數(shù)返回時(shí),此值重新設(shè)置為緩沖區(qū)內(nèi)數(shù)據(jù)的實(shí)際的長(zhǎng)度也可以使用第二個(gè)函數(shù)查詢,這時(shí)引用dwValue將起到緩沖區(qū)的作用.參數(shù)dwOption用以指定要查詢的Internet選項(xiàng),包18CInternetSession::SetOptionBOOLSetOption(DWORDdwOption,LPVOIDlpBuffer,DWORDdwBufferLength);BOOLSetOption(DWORDdwOption,DWORDdwValue);.CInternetSession::SetOption.19(4)客戶應(yīng)用程序在進(jìn)行某些操作時(shí),要耗費(fèi)相當(dāng)長(zhǎng)的時(shí)間,因此有必要向用戶返回當(dāng)前數(shù)據(jù)處理的進(jìn)程信息這就需要派生自己的CInternetSession對(duì)象,重載OnStatusCallback函數(shù)實(shí)現(xiàn)回調(diào)程序的功能,并調(diào)用EnableStatusCallback允許使用回調(diào)程序以監(jiān)視會(huì)話的狀態(tài).(4)客戶應(yīng)用程序在進(jìn)行某些操作時(shí),要耗費(fèi)相當(dāng)長(zhǎng)的時(shí)間,因20OnStatusCallback函數(shù)原型如下:virtualvoidOnStatusCallback(
DWORD_PTRdwContext,
DWORDdwInternetStatus,
LPVOIDlpvStatusInformation,
DWORDdwStatusInformationLength
);
參數(shù)dwContext用以指定應(yīng)用程序的上下文ID,.OnStatusCallback函數(shù)原型如下:.21參數(shù)dwIntemetStatus標(biāo)識(shí)回調(diào)程序的狀態(tài)碼,它用于指示將執(zhí)行的操作,并檢查在另一參數(shù)lpvStatusInformation中返回的內(nèi)容參數(shù)lpvStatusInformation是包含回調(diào)程序信息的緩沖區(qū)指針參數(shù)dwStatusInformationLength用于指定lpvStatusInformation的字節(jié)數(shù)。.參數(shù)dwIntemetStatus標(biāo)識(shí)回調(diào)程序的狀態(tài)碼,它22由于在單個(gè)會(huì)話中可以同時(shí)建立若干個(gè)連接(它們?cè)谏嫫谥锌梢詧?zhí)行許多不同的操作),所以O(shè)nStatusCallback需要通過(guò)某種方法來(lái)鑒別會(huì)話中不同連接的狀態(tài)變化,這個(gè)方法由上下文ID提供Winlnet類中的許多函數(shù)都需要使用該參數(shù),它通常是DWORD類型并且其名稱通常是dwContext.由于在單個(gè)會(huì)話中可以同時(shí)建立若干個(gè)連接(它們?cè)谏嫫谥锌梢詧?zhí)23(5)以上幾個(gè)步驟建立了客戶應(yīng)用程序的工作環(huán)境,但它們并沒(méi)有對(duì)服務(wù)器進(jìn)行任何操作,必須在此基礎(chǔ)上實(shí)現(xiàn)應(yīng)用程序的實(shí)際功能。通??蛻魬?yīng)用程序的實(shí)際功能是處理服務(wù)器的數(shù)據(jù),因此應(yīng)該獲得服務(wù)器的ClnternetFile實(shí)例,可以通過(guò)兩種方法創(chuàng)建該實(shí)例.(5)以上幾個(gè)步驟建立了客戶應(yīng)用程序的工作環(huán)境,但它們并沒(méi)24是ClntemetFile有兩個(gè)派生類:CGopherFile和CHttpFi1e,由方法CGopherConnection::OpenFile和CHttpConnection::OpenRequest得到指向CGopherFile和CHttpFi1e類對(duì)象的指針。而對(duì)于FTP應(yīng)用,直接使用基類ClntemetFile,由函數(shù)CFtpConnection::OpenFile獲得指向ClntemetFile類對(duì)象的指針此外,CHttpConnection、CFtpConnection和CGopherConnection對(duì)象由步驟(2)創(chuàng)建。.是ClntemetFile有兩個(gè)派生類:CGopherFi25CInternetFile*OpenFile原型CInternetFile*OpenFile(
LPCTSTRpstrFileName,
DWORDdwAccess=GENERIC_READ,
DWORDdwFlags=FTP_TRANSFER_TYPE_BINARY,
DWORD_PTRdwContext=1);
.CInternetFile*OpenFile原型CInte26參數(shù)pstrFileName用于指定欲打開(kāi)的文件名字符串指針。dwAccess用于指定文件的存取模式,其取值可以是:GENERIC_READ(只讀)、GENERIC_WRITE(只寫),不能同時(shí)取兩個(gè)值dwFlags用于指定數(shù)據(jù)的傳輸標(biāo)志。.參數(shù)pstrFileName用于指定欲打開(kāi)的文件名字符串指27若取FTP_TRANSFER_TYPE_ASCII
,文件傳輸將以FTPASCII(TypeA)方法進(jìn)行,這種方法將所傳輸?shù)男畔⒌母袷睫D(zhuǎn)換成本地系統(tǒng)中的對(duì)應(yīng)格式;若取FTP_TRANSFER_TYPE_BINARY,則文件傳輸以FTP‘s映像(TypeI)方法進(jìn)行文件傳輸,使用這種方法文件數(shù)據(jù)的傳輸將以其原始形式進(jìn)行,這是默認(rèn)的傳輸方法參數(shù)dwContext用于指定打開(kāi)文件所用的上下文ID.若取FTP_TRANSFER_TYPE_ASCII
,文件傳28CHttpConnection::OpenRequest函數(shù)的二個(gè)原型CHttpFile*OpenRequest(
LPCTSTRpstrVerb,
LPCTSTRpstrObjectName,
LPCTSTRpstrReferer=NULL,
DWORD_PTRdwContext=1,
LPCTSTR*ppstrAcceptTypes=NULL,
LPCTSTRpstrVersion=NULL,
DWORDdwFlags=INTERNET_FLAG_EXISTING_CONNECT);
.CHttpConnection::OpenRequest函數(shù)29CHttpFile*OpenRequest(
intnVerb,
LPCTSTRpstrObjectName,
LPCTSTRpstrReferer=NULL,
DWORD_PTRdwContext=1,
LPCTSTR*ppstrAcceptTypes=NULL,
LPCTSTRpstrVersion=NULL,
DWORDdwFlags=INTERNET_FLAG_EXISTING_CONNECT);
.CHttpFile*OpenRequest(.30參數(shù)pstrVerb是字符串指針,用于指定請(qǐng)求所使用的動(dòng)詞,如取NULL則使用GET參數(shù)pstrReferer是指定文檔URL的字符串指針,若取NULL則沒(méi)有指定的HTTP標(biāo)頭參數(shù)dwContext為指定客戶可接收的內(nèi)容類型,它是以空字符結(jié)尾的字符串,若取NULL.則服務(wù)器認(rèn)為服務(wù)器只接收“text*”類型的文檔參數(shù)pstrVersion用于指定HTTP版本,默認(rèn)為HTTP1.0版.參數(shù)pstrVerb是字符串指針,用于指定請(qǐng)求所使用的動(dòng)詞,31參數(shù)dwFlags指定函數(shù)的執(zhí)行標(biāo)志。其取值如下表INTERNET_FLAG_RELOAD強(qiáng)制進(jìn)行原始服務(wù)器上的文件、對(duì)象或目錄列表的下載,而不是從緩沖中下載INTERNET_FLAG_DONT_CACHE不向緩沖中添加返回的條目INTERNET_FLAG_MAKE_PERSISTENT將返回的條目以持久條目的形式添加到緩存中INTERNET_FLAG_SECURE使用安全事務(wù)語(yǔ)法,這只對(duì)HTTP請(qǐng)求有意義INTERNET_FLAG_NO_AUTO_REDIRECTCHttpFile::SendRequest中不自動(dòng)重定向.參數(shù)dwFlags指定函數(shù)的執(zhí)行標(biāo)志。其取值如下表INTE32參數(shù)nVerb用于指定函數(shù)的執(zhí)行標(biāo)志,其取值見(jiàn)下表0HTTP_VERB_POST1HTTP_VERB_GET2HTTP_VERB_HEAD3HTTP_VERB_PUT4HTTP_VERB_LINK5HTTP_VERB_DELETE6HTTP_VERB_UNLINK.參數(shù)nVerb用于指定函數(shù)的執(zhí)行標(biāo)志,其取值見(jiàn)下表0HTT33另外一種更簡(jiǎn)單的方法是:無(wú)需通過(guò)步驟(2)建立連接,直接通過(guò)調(diào)用ClntemetSession::OpenURL,該函數(shù)解析指定的URL,建立與由URL所代表的服務(wù)器之間的連接,然后返回一個(gè)只讀的ClntemetFile對(duì)象。該函數(shù)并不局限于某個(gè)特定的協(xié)議類型,它能夠處理任何FTPURL、HTTPURL、GopherURL或本地文件(此時(shí)將返回一個(gè)CStdioFile對(duì)象).另外一種更簡(jiǎn)單的方法是:無(wú)需通過(guò)步驟(2)建立連接,直接通34。函數(shù)OpenURL的原型CStdioFile*OpenURL(
LPCTSTRpstrURL,
DWORD_PTRdwContext=1,
DWORDdwFlags=INTERNET_FLAG_TRANSFER_ASCII,
LPCTSTRpstrHeaders=NULL,
DWORDdwHeadersLength=0);
.。函數(shù)OpenURL的原型CStdioFile*Open35參數(shù)pstrURL為指定URL名的字符串指針,其值只能以“file:”、“ftp:”、“gopher:”和“http:”開(kāi)頭參數(shù)dwContext是由應(yīng)用程序定義的值,它將與返回的句柄一起傳遞給回調(diào)函數(shù)使用dwFlags用于指定連接選項(xiàng),其取值如下表示。.參數(shù)pstrURL為指定URL名的字符串指針,其值只能以36dwFlags取值表INTERNET_FLAG_TRANSFER_ASCII
默認(rèn)值,以ASCII文本的方式傳送文件INTERNET_FLAG_TRANSFER_BINARY
以二進(jìn)制文件的方式傳送文件INTERNET_FLAG_RELOAD
即使在當(dāng)?shù)赜芯彺嬉膊粡木彺嬷凶x取數(shù)據(jù)INTERNET_FLAG_DONT_CACHE
不緩存數(shù)據(jù)INTERNET_FLAG_SECURE
只對(duì)Hπp請(qǐng)求有效,安全相關(guān)INTERNET_FLAG_PASSIVE
對(duì)FfF站點(diǎn)有效,使用被動(dòng)Ffp語(yǔ)法INTERNET_OPEN_FLAG_USE_EXISTING_CONNECT
如果可能,對(duì)于由OpenURL生成的新請(qǐng)求,重新使用現(xiàn)存到服務(wù)器的連接,而不是為每個(gè)連接請(qǐng)求都創(chuàng)建一個(gè)新會(huì)話.dwFlags取值表INTERNET_FLAG_TRANSF37pstrHeaders為指定發(fā)送到HTTP服務(wù)器的域名的字符串指針dwHeadersLength是附加域名的字符長(zhǎng)度,如果該參數(shù)為-1L并且pstrHeaders不為NULL,則pstrHeaders被當(dāng)為以零結(jié)尾的字符串進(jìn)行長(zhǎng)度計(jì)算.pstrHeaders為指定發(fā)送到HTTP服務(wù)器的域名的字符38(6)得到的服務(wù)器文件后,就可以通過(guò)調(diào)用文件對(duì)象的Read函數(shù)和Write函數(shù)讀取或?qū)懭胛募懊嬉呀?jīng)說(shuō)到,對(duì)于FTP,所使用的文件對(duì)象為ClntemetFile類,而HITP和Gopher,則使用ClntemetFile的派生類CHttpFile和CGopherFile類對(duì)象。.(6)得到的服務(wù)器文件后,就可以通過(guò)調(diào)用文件對(duì)象的Read39ClntemetFile::Read函數(shù)的原型virtualUINTRead(void*lpBuf,
UINTnCount
);
參數(shù)pBuf用于指定讀取文件數(shù)據(jù)的內(nèi)存地址指針。參數(shù)nCount用于指定將讀取的字節(jié)數(shù)。如果函數(shù)調(diào)用成功,則返回讀取的字符數(shù).ClntemetFile::Read函數(shù)的原型virt40ClntemetFile::Write函數(shù)的原型virtualvoidWrite(
constvoid*lpBuf,
UINTnCount
);
參數(shù)lpBuf用于指定被寫入的數(shù)據(jù)的起始位置。nCount用于指定將寫入的字節(jié)數(shù)如果Write調(diào)用時(shí)出現(xiàn)錯(cuò)誤,則會(huì)出現(xiàn)ClntemetException異常.ClntemetFile::Write函數(shù)的原型virt41CHttpFile::AddRequestHeaders函數(shù)的原型BOOLAddRequestHeaders(
LPCTSTRpstrHeaders,
DWORDdwFlags=HTTP_ADDREQ_FLAG_ADD_IF_NEW,
intdwHeadersLen=-1);
.CHttpFile::AddRequestHeaders函42BOOLAddRequestHeaders(
CString&str,
DWORDdwFlags=HTTP_ADDREQ_FLAG_ADD_IF_NEW);
參數(shù)pstrHeaders為字符串指針,用于指定請(qǐng)求的標(biāo)頭,每個(gè)標(biāo)頭都必須以CR/LF結(jié)尾.BOOLAddRequestHeaders.43參數(shù)dwFlags用于指定函數(shù)調(diào)用的標(biāo)志,其取值如下表所示HTTP_ADDREQ_FLAG_COALESCE
HTTP_ADDREQ_FLAG_REPLACE
HTTP_ADDREQ_FLAG_ADD_IF_NEW
HTTP_ADDREQ_FLAG_ADD
.參數(shù)dwFlags用于指定函數(shù)調(diào)用的標(biāo)志,其取值如下表所示44參數(shù)dwHeadersLen用于指定參數(shù)的字符長(zhǎng)度,如果其值為-1L,則函數(shù)認(rèn)為pstrHeaders是以0結(jié)尾的字符串,并且自動(dòng)計(jì)算其長(zhǎng)度參數(shù)str為CString對(duì)象的引用,指定請(qǐng)求的標(biāo)頭或需要添加的標(biāo)頭。該函數(shù)的功能是為HTTP請(qǐng)求添加附加的、自由格式的標(biāo)頭,一般說(shuō)來(lái)高級(jí)用戶需要使用該函數(shù)來(lái)獲取對(duì)HITP請(qǐng)求更強(qiáng)的控制。.參數(shù)dwHeadersLen用于指定參數(shù)的字符長(zhǎng)度,如果其45CHttpFile::SendRequest函數(shù)的原型BOOLSendRequest(
LPCTSTRpstrHeaders=NULL,
DWORDdwHeadersLen=0,
LPVOIDlpOptional=NULL,
DWORDdwOptionalLen=0);
.CHttpFile::SendRequest函數(shù)的原型BO46BOOLSendRequest(CString&strHeaders,
LPVOIDlpOptional=NULL,
DWORDdwOptionalLen=0);
參數(shù)pstrHeaders是字符串指針,用于指定發(fā)送的標(biāo)頭名.BOOLSendRequest(.47參數(shù)dwHeadersLen用于指定pstrHeaders中標(biāo)頭的長(zhǎng)度lpOptional用于指定應(yīng)在發(fā)送請(qǐng)求標(biāo)頭后發(fā)送的附加數(shù)據(jù),一般用于POST和PUT操作,如果沒(méi)有需要發(fā)送的附加數(shù)據(jù),則應(yīng)將該參數(shù)設(shè)置為NULL參數(shù)dwOptionalLen用于指定lpOptional的長(zhǎng)度strHeaders是指定將發(fā)送的請(qǐng)求標(biāo)頭名。.參數(shù)dwHeadersLen用于指定pstrHeaders48(7)為了提高程序的容錯(cuò)性和穩(wěn)定性,對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行處理是非常有必要的。對(duì)于Internet客戶,需要使用ClnternerException類對(duì)象處理所有可知的常規(guī)的Internet異常類型
.(7)為了提高程序的容錯(cuò)性和穩(wěn)定性,對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行處49(8)結(jié)束Internet對(duì)象,銷毀ClntemetSession對(duì)象.(8)結(jié)束Internet對(duì)象,銷毀ClntemetSes50HTTP客戶實(shí)例這個(gè)HTIP客戶實(shí)例比較簡(jiǎn)單,它僅僅用于建立與遠(yuǎn)程服務(wù)器的連接并下載指定的HTML文件。但它能充分地表現(xiàn)利用Winlnet類進(jìn)行客戶應(yīng)用程序編程的思想是一個(gè)不錯(cuò)的學(xué)習(xí)例子該實(shí)例的應(yīng)用程序界面非常簡(jiǎn)潔,僅僅包括一個(gè)地址輸入欄和-個(gè)CEditView當(dāng)用戶在地址欄中輸入網(wǎng)絡(luò)地址,應(yīng)用程序?qū)姆?wù)器中下載相應(yīng)的HTML文檔顯示在視圖中.HTTP客戶實(shí)例這個(gè)HTIP客戶實(shí)例比較簡(jiǎn)單,它僅僅用于建51編程步驟(1)在CMainFrame類中,添加兩個(gè)public成員變量,CReBarm_wndRebar;CComboBoxExm_wndAddress;(2)在CMainFrame類的OnCreate()函數(shù)中,添加如下代碼,創(chuàng)建與這個(gè)兩個(gè)對(duì)象相關(guān)聯(lián)的窗口.編程步驟(1)在CMainFrame類中,添加兩個(gè)publ52if(!m_wndRebar.Create(this)){ TRACE0("Failedtocreatecombobox\n"); return-1;//failtocreate}這里用到了CReBar類中的Create()函數(shù)原型,CReBar類對(duì)象類似于工具欄toolbar對(duì)象.if(!m_wndRebar.Create(this))53CReBar::Cretae()原型virtualBOOLCreate(
CWnd*pParentWnd,//父窗口
DWORDdwCtrlStyle=RBS_BANDBORDERS,//用細(xì)線分隔
DWORDdwStyle=WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_TOP,
UINTnID=AFX_IDW_REBAR//子窗口ID);
.CReBar::Cretae()原型virtualBOOL54if(!m_wndAddress.Create(CBS_DROPDOWN|WS_CHILD,CRect(0,0,200,120),this,ID_COMBO))//創(chuàng)建一下拉組合框{ TRACE0("Failedtocreatecombobox\n"); return-1;//failtocreate}.if(!m_wndAddress.Create(.55CComboBox::Create()原型virtualBOOL
Create(
DWORD
dwStyle,
const
RECT&
rect,
CWnd*
pParentWnd,
UINT
nID
);
.CComboBox::Create()原型virtualB56m_wndRebar.AddBar(&m_wndAddress,"地址:");//把組合框添加到Rebar中,組合框的標(biāo)題為“地址“。//對(duì)于ReBar對(duì)象,類似一容器,里面加入的元素,稱為band.m_wndRebar.AddBar(.57BOOLAddBar(
CWnd*pBar,//作為子窗口放入到rebar
LPCTSTRpszText=NULL,
CBitmap*pbmp=NULL,
DWORDdwStyle=RBBS_GRIPPERALWAYS|RBBS_FIXEDBMP);
.BOOLAddBar(.58(3)在CMainFrame中添加組合框的消息處理函數(shù),注意,在類中聲明消息映射表和消息處理函數(shù),而在類外填寫表在CMainFrame類中聲明消息處理函數(shù)如下:afx_msgvoidOnNewAddress();afx_msgvoidOnNewAddressEnter();.(3)在CMainFrame中添加組合框的消息處理函數(shù),注59在MainFrm.cpp,即CMainFrame類的實(shí)現(xiàn)文件中,填寫消息映射表ON_CBN_SELENDOK(ID_COMBO,OnNewAddress);ON_COMMAND(IDOK,OnNewAddresserEnter);對(duì)CBN_SELENDOK消息的處理,這個(gè)消息是CComboBox在完成選擇后發(fā)送給父窗口的.在MainFrm.cpp,即CMainFrame類的實(shí)現(xiàn)文件60最后添加消息處理函數(shù)voidCMainFrame::OnNewAddress(){ m_wndAddress.GetLBText(m_wndAddress.GetCurSel(),m_strAddress);//從復(fù)合框的列表框中得到字符串 connect();}.最后添加消息處理函數(shù).61CComboBox::GetLBText原型int
GetLBText(
int
nIndex,
LPTSTR
lpszText)
const;voidGetLBText(intnIndex,CString&rString
)const;
參數(shù)nIndex是列表索引參數(shù)二是準(zhǔn)備接收字符串的指針,或者取第二種形式,為一CString的引用列表索引由另一個(gè)函數(shù)int
GetCurSel(
)
const提供.CComboBox::GetLBText原型intGetL62voidCMainFrame::OnNewAddressEnter(){ m_wndAddress.GetEditCtrl()->GetWindowText(m_strAddress); COMBOBOXEXITEMitem; item.mask=CBEIF_TEXT; item.iItem=-1;//索引號(hào)置-1 item.pszText=(LPTSTR)(LPCTSTR)m_strAddress; m_wndAddress.InsertItem(&item); Connect();}.voidCMainFrame::OnNewAddressE63當(dāng)創(chuàng)建復(fù)合框時(shí),如果指定CBS_DROPDOWN參數(shù),則CComboBoxEx控件使用一個(gè)編輯框,函數(shù)GetEditCtrl()將返回指向編輯框的指針程序中使用了結(jié)構(gòu)COMBOBOXEXITEM,此結(jié)構(gòu)定義見(jiàn)下頁(yè)。第一個(gè)參數(shù)mask說(shuō)明了結(jié)構(gòu)中哪些成員是合法且必須被填充,本例中mask取CBEIF_TEXT,意味著結(jié)構(gòu)中的LPTSTR
pszText是合法的,一定要填寫.當(dāng)創(chuàng)建復(fù)合框時(shí),如果指定CBS_DROPDOWN參數(shù),則CC64typedefstruct{UINT
mask;INT_PTR
iItem;LPTSTR
pszText;int
cchTextMax;int
iImage;int
iSelectedImage;int
iOverlay;int
iIndent;LPARAM
lParam;}COMBOBOXEXITEM,*PCOMBOBOXEXITEM;.typedefstruct{.65第二十章WinInet介紹.第二十章WinInet介紹.66WinInet(WIN32InternetFunction)是一個(gè)易用的網(wǎng)絡(luò)編程接口,它使程序員在較高層次建立Internet客戶應(yīng)用程序,大大簡(jiǎn)化了編程過(guò)程VisualC++中,可以使用兩種方式進(jìn)行編程,一種是使用MFCWinInet類,另一種是直接使用WinInetAPI函數(shù).WinInet(WIN32InternetFunctio6720.1MFCWinInet類WinInet類是對(duì)WinInetAPI的封裝它具有以下功能:使用HTTP協(xié)議將HTML頁(yè)面從服務(wù)器下載到瀏覽器中發(fā)送FTP請(qǐng)求以上載或下載文件,或獲取文件目錄列表使用Gopher獲取網(wǎng)絡(luò)資源使用Gopher、HTTP或者FTP協(xié)議與服務(wù)器建立連接或者斷開(kāi)連接.20.1MFCWinInet類WinInet類是對(duì)Win68WinInet類提供了對(duì)HTTP、FTP等公共Internet協(xié)議的訪問(wèn)方法,它包括CInternetSession、CInternetConnection、CInternetFile、CHttpConnection、CGopherFile、CGopherConnection、CFtpConnection、CFileFind、CFtpFileFind、CGopherFileFind、CGopherLocator、CInternetException等十二個(gè)類.WinInet類提供了對(duì)HTTP、FTP等公共Interne691.WinInet類編程模型使用WinInet進(jìn)行Internet的客戶程序編程過(guò)程非常簡(jiǎn)單,下面簡(jiǎn)要介紹(1)創(chuàng)建CInternetSession類對(duì)象,創(chuàng)建并初始化Internet會(huì)話CInternetSession類的構(gòu)造函數(shù)原型為:.1.WinInet類編程模型使用WinInet進(jìn)行Inte70CInternetSession(LPCTSTRpstrAgent=NULL,DWORDdwContext=1,DWORDdwAccessType=INTERNET_OPEN_TYPE_PRECONFIG,LPCTSTRpstrProxyName=NULL,LPCTSTRpstrProxyBypass=NULL,DWORDdwFlags=0);.CInternetSession.71其中pstrAgent為字符串指針,用于指定調(diào)用Internet函數(shù)的應(yīng)用程序或?qū)嶓w的名字。例如“MicroSoftInternetBrowser”。如果用缺省值NULL,則框架將調(diào)用AfxGetAppName()以返回一個(gè)包含應(yīng)用程序名字并以空字符結(jié)尾的字符串。參數(shù)dwContext用以指定操作的上下文標(biāo)識(shí)符。用戶可以顯式的對(duì)此ID賦值。CInternetSession對(duì)象及其所進(jìn)行的任何工作都將與此ID相聯(lián)系.其中pstrAgent為字符串指針,用于指定調(diào)用Intern72參數(shù)dwAccessType用以指定連接請(qǐng)求的操作類型,可取的值如表所示:INTERNET_OPEN_TYPE_PRECONFIG使用注冊(cè)表中預(yù)定的類型INTERNET_OPEN_TYPE_DIRECT直接連接到InternetINTERNET_OPEN_TYPE_PROXY通過(guò)CERN代理服務(wù)器連接.參數(shù)dwAccessType用以指定連接請(qǐng)求的操作類型,可取73參數(shù)pstrProxyName用于指定首選的CERN代理服務(wù)器參數(shù)pstrProxyBypass用以指定可選的代理服務(wù)器列表,顯然只有程序使用代理服務(wù)器時(shí),此項(xiàng)選擇才有效最后一個(gè)參數(shù)dwFlags用于指定連接的選項(xiàng),可能的意思見(jiàn)下表.參數(shù)pstrProxyName用于指定首選的CERN代理服務(wù)74dwFlags的選項(xiàng)含義INTERNET_FLAG_DONT_CACHE對(duì)于本地或任何網(wǎng)關(guān)服務(wù)器都不緩存數(shù)據(jù)INTERNET_FLAG_ASYNC函數(shù)異步完成INTERNET_FLAG_OFFLINE下載操作只通過(guò)持久的緩存進(jìn)行.dwFlags的選項(xiàng)含義INTERNET_FLAG_DONT75該構(gòu)造函數(shù)調(diào)用了InternetOpen()函數(shù),并返回一個(gè)HINTERNET句柄,此句柄保存在類對(duì)象中;如果沒(méi)有打開(kāi)Internet連接,將產(chǎn)生某種異常。.該構(gòu)造函數(shù)調(diào)用了InternetOpen()函數(shù),并返回一個(gè)76(2)建立CInternetSession對(duì)象與服務(wù)器的連接對(duì)于不同的類型的服務(wù)器(http、ftp和gother)分別有不同的函數(shù)實(shí)現(xiàn)此連接,分述如下:CInternetSession::GetHttpConnection,其原型有兩種,分別為.(2)建立CInternetSession對(duì)象與服務(wù)器的連77CHttpConnection*GetHttpConnection(LPCTSTRpstrServer,INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL);.CHttpConnection*GetHttpConnec78CHttpConnection*GetHttpConnection(LPCTSTRpstrServer,DWORDdwflags,INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL);.CHttpConnection*GetHttpConnec79參數(shù)pstrServer是字符串指針,用以表示服務(wù)器名參數(shù)nPort為TCP/IP端口號(hào)參數(shù)pstrUserName用來(lái)指定用戶名參數(shù)pstrPassword指定密碼參數(shù)dwflags是連接標(biāo)志如果函數(shù)調(diào)用成功,那么函數(shù)返回一個(gè)指向CHttpConnection的指針.參數(shù)pstrServer是字符串指針,用以表示服務(wù)器名.80CFtpConnection*GetFtpConnection(LPCTSTRpstrServer,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL,INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,BOOLbPassive=FALSE);參數(shù)bPassive用以指定FTP會(huì)話的模式,TURE為主動(dòng)模式,F(xiàn)ALSE為被動(dòng)模式.CFtpConnection*GetFtpConnecti81(3)連接時(shí),可以通過(guò)下面函數(shù)查詢或設(shè)置Internet請(qǐng)求選項(xiàng)CInternetSession::QueryOptionBOOLQueryOption(DWORDdwOption,LPVOIDlpBuffer,LPDWORDlpdwBufLen)const;BOOLQueryOption(DWORDdwOption,DWORD&dwValue)const;.(3)連接時(shí),可以通過(guò)下面函數(shù)查詢或設(shè)置Internet請(qǐng)82參數(shù)dwOption用以指定要查詢的Internet選項(xiàng),包括非常多的條目,見(jiàn)MSDN參數(shù)lpBuffer為返回選項(xiàng)設(shè)置的緩沖區(qū)參數(shù)lpdwBufLen用以指定緩沖區(qū)的長(zhǎng)度,但當(dāng)函數(shù)返回時(shí),此值重新設(shè)置為緩沖區(qū)內(nèi)數(shù)據(jù)的實(shí)際的長(zhǎng)度也可以使用第二個(gè)函數(shù)查詢,這時(shí)引用dwValue將起到緩沖區(qū)的作用.參數(shù)dwOption用以指定要查詢的Internet選項(xiàng),包83CInternetSession::SetOptionBOOLSetOption(DWORDdwOption,LPVOIDlpBuffer,DWORDdwBufferLength);BOOLSetOption(DWORDdwOption,DWORDdwValue);.CInternetSession::SetOption.84(4)客戶應(yīng)用程序在進(jìn)行某些操作時(shí),要耗費(fèi)相當(dāng)長(zhǎng)的時(shí)間,因此有必要向用戶返回當(dāng)前數(shù)據(jù)處理的進(jìn)程信息這就需要派生自己的CInternetSession對(duì)象,重載OnStatusCallback函數(shù)實(shí)現(xiàn)回調(diào)程序的功能,并調(diào)用EnableStatusCallback允許使用回調(diào)程序以監(jiān)視會(huì)話的狀態(tài).(4)客戶應(yīng)用程序在進(jìn)行某些操作時(shí),要耗費(fèi)相當(dāng)長(zhǎng)的時(shí)間,因85OnStatusCallback函數(shù)原型如下:virtualvoidOnStatusCallback(
DWORD_PTRdwContext,
DWORDdwInternetStatus,
LPVOIDlpvStatusInformation,
DWORDdwStatusInformationLength
);
參數(shù)dwContext用以指定應(yīng)用程序的上下文ID,.OnStatusCallback函數(shù)原型如下:.86參數(shù)dwIntemetStatus標(biāo)識(shí)回調(diào)程序的狀態(tài)碼,它用于指示將執(zhí)行的操作,并檢查在另一參數(shù)lpvStatusInformation中返回的內(nèi)容參數(shù)lpvStatusInformation是包含回調(diào)程序信息的緩沖區(qū)指針參數(shù)dwStatusInformationLength用于指定lpvStatusInformation的字節(jié)數(shù)。.參數(shù)dwIntemetStatus標(biāo)識(shí)回調(diào)程序的狀態(tài)碼,它87由于在單個(gè)會(huì)話中可以同時(shí)建立若干個(gè)連接(它們?cè)谏嫫谥锌梢詧?zhí)行許多不同的操作),所以O(shè)nStatusCallback需要通過(guò)某種方法來(lái)鑒別會(huì)話中不同連接的狀態(tài)變化,這個(gè)方法由上下文ID提供Winlnet類中的許多函數(shù)都需要使用該參數(shù),它通常是DWORD類型并且其名稱通常是dwContext.由于在單個(gè)會(huì)話中可以同時(shí)建立若干個(gè)連接(它們?cè)谏嫫谥锌梢詧?zhí)88(5)以上幾個(gè)步驟建立了客戶應(yīng)用程序的工作環(huán)境,但它們并沒(méi)有對(duì)服務(wù)器進(jìn)行任何操作,必須在此基礎(chǔ)上實(shí)現(xiàn)應(yīng)用程序的實(shí)際功能。通常客戶應(yīng)用程序的實(shí)際功能是處理服務(wù)器的數(shù)據(jù),因此應(yīng)該獲得服務(wù)器的ClnternetFile實(shí)例,可以通過(guò)兩種方法創(chuàng)建該實(shí)例.(5)以上幾個(gè)步驟建立了客戶應(yīng)用程序的工作環(huán)境,但它們并沒(méi)89是ClntemetFile有兩個(gè)派生類:CGopherFile和CHttpFi1e,由方法CGopherConnection::OpenFile和CHttpConnection::OpenRequest得到指向CGopherFile和CHttpFi1e類對(duì)象的指針。而對(duì)于FTP應(yīng)用,直接使用基類ClntemetFile,由函數(shù)CFtpConnection::OpenFile獲得指向ClntemetFile類對(duì)象的指針此外,CHttpConnection、CFtpConnection和CGopherConnection對(duì)象由步驟(2)創(chuàng)建。.是ClntemetFile有兩個(gè)派生類:CGopherFi90CInternetFile*OpenFile原型CInternetFile*OpenFile(
LPCTSTRpstrFileName,
DWORDdwAccess=GENERIC_READ,
DWORDdwFlags=FTP_TRANSFER_TYPE_BINARY,
DWORD_PTRdwContext=1);
.CInternetFile*OpenFile原型CInte91參數(shù)pstrFileName用于指定欲打開(kāi)的文件名字符串指針。dwAccess用于指定文件的存取模式,其取值可以是:GENERIC_READ(只讀)、GENERIC_WRITE(只寫),不能同時(shí)取兩個(gè)值dwFlags用于指定數(shù)據(jù)的傳輸標(biāo)志。.參數(shù)pstrFileName用于指定欲打開(kāi)的文件名字符串指92若取FTP_TRANSFER_TYPE_ASCII
,文件傳輸將以FTPASCII(TypeA)方法進(jìn)行,這種方法將所傳輸?shù)男畔⒌母袷睫D(zhuǎn)換成本地系統(tǒng)中的對(duì)應(yīng)格式;若取FTP_TRANSFER_TYPE_BINARY,則文件傳輸以FTP‘s映像(TypeI)方法進(jìn)行文件傳輸,使用這種方法文件數(shù)據(jù)的傳輸將以其原始形式進(jìn)行,這是默認(rèn)的傳輸方法參數(shù)dwContext用于指定打開(kāi)文件所用的上下文ID.若取FTP_TRANSFER_TYPE_ASCII
,文件傳93CHttpConnection::OpenRequest函數(shù)的二個(gè)原型CHttpFile*OpenRequest(
LPCTSTRpstrVerb,
LPCTSTRpstrObjectName,
LPCTSTRpstrReferer=NULL,
DWORD_PTRdwContext=1,
LPCTSTR*ppstrAcceptTypes=NULL,
LPCTSTRpstrVersion=NULL,
DWORDdwFlags=INTERNET_FLAG_EXISTING_CONNECT);
.CHttpConnection::OpenRequest函數(shù)94CHttpFile*OpenRequest(
intnVerb,
LPCTSTRpstrObjectName,
LPCTSTRpstrReferer=NULL,
DWORD_PTRdwContext=1,
LPCTSTR*ppstrAcceptTypes=NULL,
LPCTSTRpstrVersion=NULL,
DWORDdwFlags=INTERNET_FLAG_EXISTING_CONNECT);
.CHttpFile*OpenRequest(.95參數(shù)pstrVerb是字符串指針,用于指定請(qǐng)求所使用的動(dòng)詞,如取NULL則使用GET參數(shù)pstrReferer是指定文檔URL的字符串指針,若取NULL則沒(méi)有指定的HTTP標(biāo)頭參數(shù)dwContext為指定客戶可接收的內(nèi)容類型,它是以空字符結(jié)尾的字符串,若取NULL.則服務(wù)器認(rèn)為服務(wù)器只接收“text*”類型的文檔參數(shù)pstrVersion用于指定HTTP版本,默認(rèn)為HTTP1.0版.參數(shù)pstrVerb是字符串指針,用于指定請(qǐng)求所使用的動(dòng)詞,96參數(shù)dwFlags指定函數(shù)的執(zhí)行標(biāo)志。其取值如下表INTERNET_FLAG_RELOAD強(qiáng)制進(jìn)行原始服務(wù)器上的文件、對(duì)象或目錄列表的下載,而不是從緩沖中下載INTERNET_FLAG_DONT_CACHE不向緩沖中添加返回的條目INTERNET_FLAG_MAKE_PERSISTENT將返回的條目以持久條目的形式添加到緩存中INTERNET_FLAG_SECURE使用安全事務(wù)語(yǔ)法,這只對(duì)HTTP請(qǐng)求有意義INTERNET_FLAG_NO_AUTO_REDIRECTCHttpFile::SendRequest中不自動(dòng)重定向.參數(shù)dwFlags指定函數(shù)的執(zhí)行標(biāo)志。其取值如下表INTE97參數(shù)nVerb用于指定函數(shù)的執(zhí)行標(biāo)志,其取值見(jiàn)下表0HTTP_VERB_POST1HTTP_VERB_GET2HTTP_VERB_HEAD3HTTP_VERB_PUT4HTTP_VERB_LINK5HTTP_VERB_DELETE6HTTP_VERB_UNLINK.參數(shù)nVerb用于指定函數(shù)的執(zhí)行標(biāo)志,其取值見(jiàn)下表0HTT98另外一種更簡(jiǎn)單的方法是:無(wú)需通過(guò)步驟(2)建立連接,直接通過(guò)調(diào)用ClntemetSession::OpenURL,該函數(shù)解析指定的URL,建立與由URL所代表的服務(wù)器之間的連接,然后返回一個(gè)只讀的ClntemetFile對(duì)象。該函數(shù)并不局限于某個(gè)特定的協(xié)議類型,它能夠處理任何FTPURL、HTTPURL、GopherURL或本地文件(此時(shí)將返回一個(gè)CStdioFile對(duì)象).另外一種更簡(jiǎn)單的方法是:無(wú)需通過(guò)步驟(2)建立連接,直接通99。函數(shù)OpenURL的原型CStdioFile*OpenURL(
LPCTSTRpstrURL,
DWORD_PTRdwContext=1,
DWORDdwFlags=INTERNET_FLAG_TRANSFER_ASCII,
LPCTSTRpstrHeaders=NULL,
DWORDdwHeadersLength=0);
.。函數(shù)OpenURL的原型CStdioFile*Open100參數(shù)pstrURL為指定URL名的字符串指針,其值只能以“file:”、“ftp:”、“gopher:”和“http:”開(kāi)頭參數(shù)dwContext是由應(yīng)用程序定義的值,它將與返回的句柄一起傳遞給回調(diào)函數(shù)使用dwFlags用于指定連接選項(xiàng),其取值如下表示。.參數(shù)pstrURL為指定URL名的字符串指針,其值只能以101dwFlags取值表INTERNET_FLAG_TRANSFER_ASCII
默認(rèn)值,以ASCII文本的方式傳送文件INTERNET_FLAG_TRANSFER_BINARY
以二進(jìn)制文件的方式傳送文件INTERNET_FLAG_RELOAD
即使在當(dāng)?shù)赜芯彺嬉膊粡木彺嬷凶x取數(shù)據(jù)INTERNET_FLAG_DONT_CACHE
不緩存數(shù)據(jù)INTERNET_FLAG_SECURE
只對(duì)Hπp請(qǐng)求有效,安全相關(guān)INTERNET_FLAG_PASSIVE
對(duì)FfF站點(diǎn)有效,使用被動(dòng)Ffp語(yǔ)法INTERNET_OPEN_FLAG_USE_EXISTING_CONNECT
如果可能,對(duì)于由OpenURL生成的新請(qǐng)求,重新使用現(xiàn)存到服務(wù)器的連接,而不是為每個(gè)連接請(qǐng)求都創(chuàng)建一個(gè)新會(huì)話.dwFlags取值表INTERNET_FLAG_TRANSF102pstrHeaders為指定發(fā)送到HTTP服務(wù)器的域名的字符串指針dwHeadersLength是附加域名的字符長(zhǎng)度,如果該參數(shù)為-1L并且pstrHeaders不為NULL,則pstrHeaders被當(dāng)為以零結(jié)尾的字符串進(jìn)行長(zhǎng)度計(jì)算.pstrHeaders為指定發(fā)送到HTTP服務(wù)器的域名的字符103(6)得到的服務(wù)器文件后,就可以通過(guò)調(diào)用文件對(duì)象的Read函數(shù)和Write函數(shù)讀取或?qū)懭胛募懊嬉呀?jīng)說(shuō)到,對(duì)于FTP,所使用的文件對(duì)象為ClntemetFile類,而HITP和Gopher,則使用ClntemetFile的派生類CHttpFile和CGopherFile類對(duì)象。.(6)得到的服務(wù)器文件后,就可以通過(guò)調(diào)用文件對(duì)象的Read104ClntemetFile::Read函數(shù)的原型virtualUINTRead(void*lpBuf,
UINTnCount
);
參數(shù)pBuf用于指定讀取文件數(shù)據(jù)的內(nèi)存地址指針。參數(shù)nCount用于指定將讀取的字節(jié)數(shù)。如果函數(shù)調(diào)用成功,則返回讀取的字符數(shù).ClntemetFile::Read函數(shù)的原型virt105ClntemetFile::Write函數(shù)的原型virtualvoidWrite(
constvoid*lpBuf,
UINTnCount
);
參數(shù)lpBuf用于指定被寫入的數(shù)據(jù)的起始位置。nCount用于指定將寫入的字節(jié)數(shù)如果Write調(diào)用時(shí)出現(xiàn)錯(cuò)誤,則會(huì)出現(xiàn)ClntemetException異常.ClntemetFile::Write函數(shù)的原型virt106CHttpFile::AddRequestHeaders函數(shù)的原型BOOLAddRequestHeaders(
LPCTSTRpstrHeaders,
DWORDdwFlags=HTTP_ADDREQ_FLAG_ADD_IF_NEW,
intdwHeadersLen=-1);
.CHttpFile::AddRequestHeaders函107BOOLAddRequestHeaders(
CString&str,
DWORDdwFlags=HTTP_ADDREQ_FLAG_ADD_IF_NEW);
參數(shù)pstrHeaders為字符串指針,用于指定請(qǐng)求的標(biāo)頭,每個(gè)標(biāo)頭都必須以CR/LF結(jié)尾.BOOLAddRequestHeaders.108參數(shù)dwFlags用于指定函數(shù)調(diào)用的標(biāo)志,其取值如下表所示HTTP_ADDREQ_FLAG_COALESCE
HTTP_ADDREQ_FLAG_REPLACE
HTTP_ADDREQ_FLAG_ADD_IF_NEW
HTTP_ADDREQ_FLAG_ADD
.參數(shù)dwFlags用于指定函數(shù)調(diào)用的標(biāo)志,其取值如下表所示109參數(shù)dwHeadersLen用于指定參數(shù)的字符長(zhǎng)度,如果其值為-1L,則函數(shù)認(rèn)為pstrHeaders是以0結(jié)尾的字符串,并且自動(dòng)計(jì)算其長(zhǎng)度參數(shù)str為CString對(duì)象的引用,指定請(qǐng)求的標(biāo)頭或需要添加的標(biāo)頭。該函數(shù)的功能是為HTTP請(qǐng)求添加附加的、自由格式的標(biāo)頭,一般說(shuō)來(lái)高級(jí)用戶需要使用該函數(shù)來(lái)獲取對(duì)HITP請(qǐng)求更強(qiáng)的控制。.參數(shù)dwHeadersLen用于指定參數(shù)的字符長(zhǎng)度,如果其110CHttpFile::SendRequest函數(shù)的原型BOOLSendRequest(
LPCTSTRpstrHeaders=NULL,
DWORDdwHeadersLen=0,
LPVOIDlpOptional=NULL,
DWORDdwOptionalLen=0);
.CHttpFile::SendRequest函數(shù)的原型BO111BOOLSendRequest(CString&strHeaders,
LPVOIDlpOptional=NULL,
DWORDdwOptionalLen=0);
參數(shù)pstrHeaders是字符串指針,用于指定發(fā)送的標(biāo)頭名.BOOLSendRequest(.112參數(shù)dwHeadersLen用于指定pstrHeaders中標(biāo)頭的長(zhǎng)度lpOptional用于指定應(yīng)在發(fā)送請(qǐng)求標(biāo)頭后發(fā)送的附加數(shù)據(jù),一般用于POST和PUT操作,如果沒(méi)有需要發(fā)送的附加數(shù)據(jù),則應(yīng)將該參數(shù)設(shè)置為NULL參數(shù)dwOptionalLen用于指定lpOptional的長(zhǎng)度strHeaders是指定將發(fā)送的請(qǐng)求標(biāo)頭名。.參數(shù)dwHeadersLen用于指定pstrHeaders113(7)為了提高程序的容錯(cuò)性和穩(wěn)定性,對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行處理是非常有必要的。對(duì)于Internet客戶,需要使用ClnternerException類對(duì)象處理所有可知的常規(guī)的Internet異常類型
.(7)為了提高程序的容錯(cuò)性和穩(wěn)定性,對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行處114(8)結(jié)束Internet對(duì)象,銷毀ClntemetSession對(duì)象.(8)結(jié)束Internet對(duì)象,銷毀ClntemetSes115HTTP客戶實(shí)例這個(gè)HTIP客戶實(shí)例比較簡(jiǎn)單,它僅僅用于建立與遠(yuǎn)程服務(wù)器的連接并下載指定的HTML文件。但它能充分地表現(xiàn)利用Winlnet類進(jìn)行客戶應(yīng)用程序編程的思想是一個(gè)不錯(cuò)的學(xué)習(xí)例子該實(shí)例的應(yīng)用程序界面非常簡(jiǎn)潔,僅僅包括一個(gè)地址輸入欄和-個(gè)CEditView當(dāng)用戶在地址欄中輸入網(wǎng)絡(luò)地址,應(yīng)用程序?qū)姆?wù)器中下載相應(yīng)的HTML文檔顯示在視圖中.HTTP客戶實(shí)例這個(gè)HTIP客戶實(shí)例比較簡(jiǎn)單,它僅僅用于建116編程步驟(1)在CMainFrame類中,添加兩個(gè)public成員變量,CReBarm_wndRebar;CComboBoxExm_wndAddress;(2)在CMainFrame類的OnCreate()函數(shù)中,添加如下代碼,創(chuàng)建與這個(gè)兩個(gè)對(duì)象相關(guān)聯(lián)的窗口.編程步驟(1)在CMainFrame類中,添加兩個(gè)publ117if(!m_wndRebar.Create(this)){ TRACE0("Failedtocreatecombobox\n"); return-1;//failtocreate}這里用到了CReBar類中的Create()函數(shù)原型,CReBar類對(duì)象類似于工具欄toolbar對(duì)象
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 從容面對(duì):育嬰師試題及答案
- 提升人力資源管理能力的試題及答案解析
- 現(xiàn)代農(nóng)業(yè)技術(shù)培養(yǎng)方案(最終)
- 投資策略的選擇及應(yīng)用試題及答案
- 小學(xué)家長(zhǎng)會(huì)感恩教育
- 2024圖書(shū)管理員行業(yè)案例研究試題及答案
- 黑龍江林業(yè)職業(yè)技術(shù)學(xué)院《口腔解剖生理學(xué)綜合實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 如何通過(guò)禮儀提升客戶滿意度試題及答案
- 黑龍江省佳木斯市樺川縣2025年五下數(shù)學(xué)期末統(tǒng)考模擬試題含答案
- 黑龍江省哈九中2024-2025學(xué)年高三摸底(4月)調(diào)研測(cè)試物理試題含解析
- 物業(yè)公司章程模板
- 基于主成分-聚類分析的各地區(qū)火災(zāi)事故研究(附有SAS程序)
- 中國(guó)人工智能系列白皮書(shū) - 大模型技術(shù)(2023 版)
- 精神科癥狀學(xué)理論知識(shí)考核試題
- 河湖水系連通演變過(guò)程
- 財(cái)務(wù)審計(jì)投標(biāo)方案(完整技術(shù)標(biāo))
- 圖 紙 會(huì) 審 簽 到 表
- 城鎮(zhèn)燃?xì)鈱I(yè)知識(shí)培訓(xùn)課件
- 腹內(nèi)壓的測(cè)定與腹內(nèi)高壓的處理
- 消毒產(chǎn)品生產(chǎn)企業(yè)衛(wèi)生管理規(guī)范
- 婦科PDCA循環(huán)在降低廣泛全宮切除術(shù)后尿潴留的發(fā)生率的應(yīng)用
評(píng)論
0/150
提交評(píng)論