简单的WinInet编程
生活随笔
收集整理的這篇文章主要介紹了
简单的WinInet编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
windows程序
// tt.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <iostream> #include <windows.h> #pragma comment(lib,"Winmm.lib")#include <UrlMon.h> #pragma comment(lib, "urlmon.lib")#include <Wininet.h> #pragma comment(lib,"Wininet.lib")#pragma warning(disable:4996)using namespace std;/* 在服務中、一般程序中利用 Inet 相關函數下載數據[原創(chuàng)] 雖然可以使用 URLDownloadFileToXXX() 這個 API,但是,它在使用了代理的時候會遇到麻煩。 這點,Windows 自動更新發(fā)生過這樣的問題:如果使用了 IE 代理,如果下載代碼位于系統(tǒng)帳號 下,代理設置可能會失效。當然,也可以為系統(tǒng)帳號手動設置代理(其實就是 IE 的代理的設置 方法),不過,程序會受到很多的限制。 *///下載資源 int InternetDownloadFile(char *szUrl, char* szFileName) {DWORD dwFlags;BOOL bInternet=InternetGetConnectedState(&dwFlags, 0);BOOL bConnected=InternetCheckConnection(szUrl,FLAG_ICC_FORCE_CONNECTION,0);/*InternetOpen:函數作用:初始化一個應用程序,以使用WinINet 函數。參數一:指向一個空結束的字符串,該字符串指定的應用程序或實體調用WinInet函數的名稱。使用此名稱作為用戶代理的HTTP協(xié)議。*/char strAgent[65];memset(strAgent,0,sizeof(strAgent));sprintf(strAgent, "Agent%ld", timeGetTime());HINTERNET hOpen;if(!(dwFlags & INTERNET_CONNECTION_PROXY))hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);elsehOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);/*InternetOpenUrl:函數作用:通過一個完整的FTP,Gopher或HTTP網址打開一個資源。*/char szHead[] = "Accept: */*\r\n\r\n";HINTERNET hConnect;if ( !(hConnect = InternetOpenUrl( hOpen, szUrl, szHead,lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0))){InternetCloseHandle(hOpen);return -1;}/*HttpQueryInfo函數:服務器會把該文件信息返回給你,其中包括大小啊、更新時間啊(如果有更新時間的話)、類型啊等等*/DWORD dwByteToRead = 0;DWORD dwSizeOfRq = 4;if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwByteToRead, &dwSizeOfRq, NULL)){dwByteToRead = 0;}//文件已經下載了的大小DWORD fileNowSize=0;DWORD dwSize;char szTemp[16384];memset(szTemp,0,sizeof(szTemp));FILE* file = fopen(szFileName,"ab+");do{if (!InternetReadFile (hConnect, szTemp, 16384, &dwSize))//每次傳16KB{fclose(file);return -1;}if (dwSize==0){break;}else{fwrite(szTemp,1,dwSize,file);}}while (TRUE);fclose(file);InternetCloseHandle(hConnect);InternetCloseHandle(hOpen);return 0; }int _tmain(int argc, _TCHAR* argv[]) {//方式一:URLDownloadToFile // HRESULT hr = URLDownloadToFile(0,_T("http://baike.baidu.com/link?url=y20SMl-bsH-RxCxiQBH_aXgaMlYLxieWswT04SaC0M-dnGfkE6BR1DUrXjxJbrdvjRnwNJzZDZm5HjaPBT0vYq"),_T ("1.txt"), 0,NULL); // if (hr== S_OK) // { // cout<< "ok"<< endl; // }//方式二:Wininet//InternetDownloadFile("http://baike.baidu.com/link?url=y20SMl-bsH-RxCxiQBH_aXgaMlYLxieWswT04SaC0M-dnGfkE6BR1DUrXjxJbrdvjRnwNJzZDZm5HjaPBT0vYq","c:\\1.txt");return 0; }MFC下封裝的類: #include <afxinet.h>void Ctt2Dlg::OnBnClickedBtnGet() {CString strWriteName="2014252.html";CString strFileName="http://www.cnblogs.com/carekee/articles/" + strWriteName;CInternetSession sess;CHttpFile* fileGet;try{fileGet=(CHttpFile*)sess.OpenURL(strFileName);}catch(CException* e){fileGet = 0;throw;} if(fileGet){DWORD dwStatus;DWORD dwBuffLen = sizeof(dwStatus);CString strSentence;BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);if( bSuccess && dwStatus>= 200 && dwStatus<300 ){CStdioFile fileWrite;if(fileWrite.Open(strWriteName, CFile::modeWrite|CFile::modeCreate)){while(fileGet->ReadString(strSentence)){fileWrite.WriteString(strSentence+"\n");}fileWrite.Close();AfxMessageBox("下載完畢");}else{AfxMessageBox("本地文件"+strWriteName+"打開出錯.");}}else{strSentence.Format("打開網頁文件出錯,錯誤碼:%d", dwStatus);AfxMessageBox(strSentence);}fileGet->Close();delete fileGet;}else{AfxMessageBox("不能找到網頁文件!");}sess.Close();}void Ctt2Dlg::OnBnClickedBtnPost() {CString strHttpName="http://localhost/TestReg/RegForm.aspx"; // 需要提交數據的頁面CString strFormData = "username=abc&password=123"; // 需要提交的數據CInternetSession sess;CHttpFile* fileGet;CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded"); // 請求頭try{fileGet=(CHttpFile*)sess.OpenURL(strHttpName);//打開文件}catch(CException* e){fileGet = 0;throw;}CString strSentence, strGetSentence = "";if(fileGet){DWORD dwStatus;DWORD dwBuffLen = sizeof(dwStatus);BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);if( bSuccess && dwStatus>= 200 &&dwStatus<300 ){BOOL result = fileGet->SendRequest(strHeaders, (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());while(fileGet->ReadString(strSentence)) // 讀取提交數據后的返回結果{strGetSentence = strGetSentence + strSentence + char(13) + char(10);}AfxMessageBox(strGetSentence); // 顯示返回網頁內容}else{strSentence.Format("POST出錯,錯誤碼:%d", dwStatus);AfxMessageBox(strSentence);}fileGet->Close();delete fileGet;}else{AfxMessageBox("不能找到網頁文件!");}sess.Close();}
總結
以上是生活随笔為你收集整理的简单的WinInet编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC Radio Button 使用
- 下一篇: 用实例证明dll中new的内存不能在ex