InternetOpen InternetOpenUrl InternetReadFile 和 InternetCloseHandle
文章目錄
- InternetOpen
- 函數功能
- 函數聲明
- 第一個參數
- 第二個參數
- 第三個參數
- 第四個參數
- 第五個參數
- 返回值
- 補充:
- InternetOpenUrl
- 函數功能
- 函數聲明
- 第一個參數
- 第二個參數
- 第三個參數
- 第四個參數
- 第五個參數
- 第六個參數
- 返回值
- 補充
- 補充
- InternetReadFile
- 函數功能
- 函數聲明
- 第一個參數
- 第二個參數
- 第三個參數
- 第四個參數
- 返回值
- 補充:
- InternetCloseHandle
- 函數功能
- 函數聲明
- 第一個參數
- 返回值
- 代碼實現:
InternetOpen
函數功能
初始化應用程序對WinINet函數的使用
函數聲明
INTERNETAPI_(HINTERNET) InternetOpenA(_In_opt_ LPCSTR lpszAgent,_In_ DWORD dwAccessType,_In_opt_ LPCSTR lpszProxy,_In_opt_ LPCSTR lpszProxyBypass,_In_ DWORD dwFlags);第一個參數
指向以null終止的字符串的指針,該字符串指定調用WinINet函數的應用程序或實體的名稱。該名稱在HTTP協議中用作用戶代理
第二個參數
所需的訪問類型。此參數可以是下列值之一
| INTERNET_OPEN_TYPE_DIRECT | 在本地解析所有主機名。 |
| INTERNET_OPEN_TYPE_PRECONFIG | 從注冊表中檢索代理或直接配置。 |
| INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY | 從注冊表中檢索代理或直接配置,并阻止使用啟動的Microsoft JScript或Internet安裝程序(INS)文件。 |
| INTERNET_OPEN_TYPE_PROXY | 將請求傳遞到代理,除非提供了代理繞過列表,并且要解析的名稱繞過了代理。在這種情況下,該函數使用 INTERNET_OPEN_TYPE_DIRECT。 |
第三個參數
指向以null終止的字符串的指針,該字符串指定通過將dwAccessType設置為 INTERNET_OPEN_TYPE_PROXY來指定代理訪問時要使用的代理服務器的名稱 。不要使用空字符串,因為 InternetOpen會將其用作代理名稱。WinINet函數僅識別CERN類型的代理(僅HTTP)和TIS FTP網關(僅FTP)。如果安裝了Microsoft Internet Explorer,則這些功能還支持SOCKS代理。可以通過CERN類型的代理將FTP請求更改為HTTP請求或使用 InternetOpenUrl來進行。如果 dwAccessType未設置為 INTERNET_OPEN_TYPE_PROXY,此參數將被忽略,并且應該為NULL。有關列出代理服務器的更多信息,請參閱“啟用Internet功能”的“ 列出代理服務器”部分 。
第四個參數
指向以空值結尾的字符串的指針,該字符串指定主機名或IP地址(或兩者)的可選列表,當dwAccessType設置為 INTERNET_OPEN_TYPE_PROXY時,不應通過代理進行路由 。該列表可以包含通配符。不要使用空字符串,因為 InternetOpen會將其用作代理繞過列表。如果此參數指定“ ”宏,則該函數繞過不包含句點的任何主機名的代理。
默認情況下,WinINet將繞過使用主機名“ localhost”,“ loopback”,“ 127.0.0.1”或“ [:: 1]”的請求的代理。存在此現象的原因在于遠程代理服務器通常將無法正確解析這些地址。Internet Explorer 9: 可以使用“ <-loopback>”宏從代理繞過列表中刪除本地計算機。
如果 dwAccessType未設置為 INTERNET_OPEN_TYPE_PROXY,則此參數將被忽略,并且應為NULL。
第五個參數
選項。此參數可以是以下值的組合。
| INTERNET_FLAG_ASYNC | 僅對從此函數返回的句柄派生的句柄發出異步請求。 |
| INTERNET_FLAG_FROM_CACHE | 不發出網絡請求。所有實體均從緩存中返回。如果所請求的項目不在緩存中,則返回適當的錯誤,例如ERROR_FILE_NOT_FOUND。 |
| INTERNET_FLAG_OFFLINE | 與INTERNET_FLAG_FROM_CACHE相同 。不發出網絡請求。所有實體均從緩存中返回。如果所請求的項目不在緩存中,則返回適當的錯誤,例如ERROR_FILE_NOT_FOUND。 |
返回值
返回應用程序傳遞給后續WinINet函數的有效句柄。如果 InternetOpen失敗,則返回NULL。要檢索特定的錯誤消息,請調用 GetLastError。
補充:
InternetOpen是應用程序調用的第一個WinINet函數。它告訴Internet DLL初始化內部數據結構,并為將來來自應用程序的調用做準備。當應用程序完成Internet功能使用后,應調用 InternetCloseHandle釋放句柄和所有相關資源。
該應用程序可以撥打InternetOpen任意數量的電話 ,盡管通常一個電話就足夠了。應用程序可能需要為每個InternetOpen實例定義單獨的行為,例如為每個 實例配置不同的代理服務器。
調用應用程序使用InternetOpen返回的HINTERNET句柄 完成后 ,必須使用InternetCloseHandle函數將其關閉 。
與WinINet API的所有其他方面一樣,不能從DllMain或全局對象的構造函數和析構函數中安全地調用此函數。
注意:
WinINet不支持服務器實現。此外,不應在服務中使用它。對于服務器實現或服務,請使用Microsoft Windows HTTP Services(WinHTTP)
InternetOpenUrl
函數功能
打開由完整的FTP或HTTP URL指定的資源
函數聲明
INTERNETAPI_(HINTERNET) InternetOpenUrlA(_In_ HINTERNET hInternet,_In_ LPCSTR lpszUrl,_In_reads_opt_(dwHeadersLength) LPCSTR lpszHeaders,_In_ DWORD dwHeadersLength,_In_ DWORD dwFlags,_In_opt_ DWORD_PTR dwContext);第一個參數
當前Internet會話的句柄。該句柄必須已由先前對InternetOpen的調用返回 。
第二個參數
指向以空字符結尾的字符串變量的指針,該變量指定要開始讀取的URL。僅支持以ftp:,http:或https:開頭的URL。
第三個參數
指向以null終止的字符串的指針,該字符串指定要發送到HTTP服務器的標頭。有關更多信息,請參見HttpSendRequest函數中lpszHeaders參數 的描述
第四個參數
附加標頭的大小,以TCHARs為單位。如果此參數為-1L并且 lpszHeaders不為NULL, 則假定lpszHeaders為零終止(ASCIIZ)并計算長度。
第五個參數
此參數可以是下列值之一。
| INTERNET_FLAG_EXISTING_CONNECT | 如果存在的InternetConnect對象具有發出請求所需的相同屬性,則嘗試使用該對象。這僅對FTP操作有用,因為FTP是通常在同一會話期間執行多個操作的唯一協議。WinINet API為InternetOpen生成的每個HINTERNET句柄緩存一個連接句柄。 InternetOpenUrl 將此標志用于HTTP和FTP連接。 |
| INTERNET_FLAG_HYPERLINK | 在確定是否從網絡重新加載項目時,如果沒有過期時間,也沒有從服務器返回LastModified時間,則強制重新加載。 |
| INTERNET_FLAG_HYPERLINK | 在確定是否從網絡重新加載項目時,如果沒有過期時間,也沒有從服務器返回LastModified時間,則強制重新加載。 |
| INTERNET_FLAG_IGNORE_CERT_CN_INVALID | 禁用根據請求中給定的主機名檢查從服務器返回的基于SSL / PCT的證書。WinINet函數通過比較匹配的主機名和簡單的通配符規則來使用對證書的簡單檢查。 |
| INTERNET_FLAG_IGNORE_CERT_DATE_INVALID | 禁用對基于SSL / PCT的證書的有效日期進行檢查 |
| INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | 禁止檢測這種特殊類型的重定向。使用此標志時,WinINet透明地允許從HTTPS重定向到HTTP URL。 |
| INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | 禁用對這種特殊類型的重定向的檢測。使用此標志時,WinINet透明地允許從HTTP重定向到HTTPS URL。 |
| INTERNET_FLAG_KEEP_CONNECTION | 對連接使用保持活動的語義(如果可用)。對于Microsoft網絡(MSN),NTLM和其他類型的身份驗證,此標志是必需的。 |
| INTERNET_FLAG_NEED_FILE | 如果無法緩存該文件,則導致創建一個臨時文件。 |
| INTERNET_FLAG_NO_AUTH | 不自動嘗試身份驗證 |
| INTERNET_FLAG_NO_AUTO_REDIRECT | 不會自動處理HttpSendRequest中的重定向 |
| INTERNET_FLAG_NO_CACHE_WRITE | 不將返回的實體添加到緩存中。 |
| INTERNET_FLAG_NO_COOKIES | 不會自動向請求添加cookie標頭,也不會自動將返回的cookie添加到cookie數據庫。 |
| INTERNET_FLAG_NO_UI | 禁用cookie對話框。 |
| INTERNET_FLAG_PASSIVE | 使用被動FTP語義。 InternetOpenUrl將此標志用于FTP文件和目錄。 |
| INTERNET_FLAG_PRAGMA_NOCACHE | 強制請求由源服務器解決,即使代理上存在緩存的副本也是如此。 |
| INTERNET_FLAG_RAW_DATA | 檢索FTP目錄信息時 ,以WIN32_FIND_DATA結構形式返回數據 。如果未指定此標志,或者如果調用是通過CERN代理進行的,則 InternetOpenUrl返回目錄的HTML版本。Windows XP和Windows Server 2003 R2及更早版本: 檢索Gopher目錄信息時,還以GOPHER_FIND_DATA結構形式返回數據。 |
| INTERNET_FLAG_RELOAD | 強制從源服務器(而不是從緩存)下載請求的文件,對象或目錄列表。 |
| INTERNET_FLAG_RESYNCHRONIZE | 如果自上次下載以來已修改資源,則重新加載HTTP資源。重新加載所有FTP資源。Windows XP和Windows Server 2003 R2及更早版本: Gopher資源也被重新加載。 |
| INTERNET_FLAG_SECURE | 使用安全的事務語義。這轉化為使用安全套接字層/專用通信技術(SSL / PCT),僅在HTTP請求中有意義。 |
第六個參數
指向變量的指針,該變量指定應用程序定義的值以及返回的句柄,該值將傳遞給任何回調函數。
返回值
如果成功建立連接,則返回URL的有效句柄;如果連接失敗,則返回NULL。要檢索特定的錯誤消息,請調用 GetLastError。要確定為什么拒絕訪問該服務,請致電 InternetGetLastResponseInfo。
補充
如果所使用的URL包含相對URL和基本URL,并用空格分隔,則首先調用 InternetCanonicalizeUrl。
這是應用程序可以通過WinINet支持的任何協議檢索數據的常規功能。當應用程序不需要訪問協議的詳細信息而只需要與URL對應的數據時,此功能特別有用。在 InternetOpenUrl中,函數解析URL字符串,建立與服務器的連接,并準備下載由URL標識的數據。然后,應用程序可以使用 InternetReadFile(用于文件)或 InternetFindNextFile(用于目錄)來檢索URL數據。不需要在InternetOpenUrl之前 調用 InternetConnect。
Windows XP和Windows Server 2003 R2及更早版本: InternetOpenUrl在端口小于1024的端口上禁用Gopher,但端口70(標準Gopher端口)和端口105(通常用于中央服務組織(CSO)名稱搜索)除外。
調用應用程序使用InternetOpenUrl返回的HINTERNET句柄 完成后 ,必須使用InternetCloseHandle函數將其關閉 。
注意 在異步模式下工作時(InternetOpen的dwFlags參數指定INTERNET_FLAG_ASYNC),并且dwContext參數為零(INTERNET_NO_CALLBACK),將不會調用在會話句柄上使用InternetSetStatusCallback設置的回調函數,但是,該調用仍將在異步模式
與WinINet API的所有其他方面一樣,不能從DllMain或全局對象的構造函數和析構函數中安全地調用此函數。
補充
WinINet不支持服務器實現。此外,不應在服務中使用它。對于服務器實現或服務,請使用Microsoft Windows HTTP Services(WinHTTP)
InternetReadFile
函數功能
從InternetOpenUrl, FtpOpenFile或 HttpOpenRequest函數打開的句柄中讀取數據 。
函數聲明
BOOLAPI InternetReadFile(_In_ HINTERNET hFile,_Out_writes_bytes_(dwNumberOfBytesToRead) __out_data_source(NETWORK) LPVOID lpBuffer,_In_ DWORD dwNumberOfBytesToRead,_Out_ LPDWORD lpdwNumberOfBytesRead);第一個參數
從先前對InternetOpenUrl, FtpOpenFile或 HttpOpenRequest的調用返回的句柄 。
第二個參數
指向接收數據的緩沖區的指針。
第三個參數
要讀取的字節數。
第四個參數
指向一個變量的指針,該變量接收讀取的字節數。 在執行任何工作或錯誤檢查之前,InternetReadFile將此值設置為零
返回值
如果成功,則返回TRUE,否則返回FALSE。要獲取擴展的錯誤信息,請調用 GetLastError。應用程序還可以在必要時使用 InternetGetLastResponseInfo
補充:
InternetReadFile的操作與基本的ReadFile函數非常相似 ,但有一些例外。通常, InternetReadFile從HINTERNET句柄檢索數據 作為字節的順序流。每次對InternetReadFile的調用要讀取的數據量 由dwNumberOfBytesToRead參數指定, 并且該數據在lpBuffer參數中返回 。普通讀取為每次InternetReadFile的調用檢索指定的 dwNumberOfBytesToRead, 直到到達文件末尾。為確保檢索到所有數據,應用程序必須繼續調用 InternetReadFile直到該函數返回TRUE并且 lpdwNumberOfBytesRead參數等于零為止。如果將請求的數據寫入緩存,這尤其重要,因為否則緩存將無法正確更新,下載的文件也不會提交到緩存。請注意,除非原始請求打開數據流的請求設置了INTERNET_FLAG_NO_CACHE_WRITE標志,否則緩存將自動發生。
當應用程序使用InternetOpenUrl檢索句柄時 ,WinINet會嘗試使所有數據看起來像文件下載,以使該應用程序更容易從Internet進行讀取。對于某些類型的信息(例如FTP文件目錄列表),它將
InternetReadFile返回的數據轉換為HTML流。它逐行執行此操作。例如,它可以將FTP目錄列表轉換為一行HTML,然后將此HTML返回給應用程序。
WinINet嘗試一次將HTML寫入 lpBuffer緩沖區的一行。如果應用程序的緩沖區太小而無法容納至少一行生成的HTML,則將返回錯誤代碼 ERROR_INSUFFICIENT_BUFFER,以指示應用程序需要更大的緩沖區。同樣,轉換后的行可能不會完全填滿緩沖區,因此 InternetReadFile可以返回的lpBuffer中的數據少于請求的數據 。隨后的讀取將檢索所有已轉換的HTML。應用程序必須再次檢查是否如前所述檢索了所有數據。
與WinINet API的所有其他方面一樣,不能從DllMain或全局對象的構造函數和析構函數中安全地調用此函數。
異步運行時,如果對InternetReadFile的調用未導致完成的事務,它將返回FALSE,而對GetLastError的后續調用將返回ERROR_IO_PENDING。當交易完成InternetStatusCallback以前調用指定 InternetSetStatusCallback將被用INTERNET_STATUS_REQUEST_COMPLETE。
InternetCloseHandle
函數功能
關閉單個Internet句柄。
函數聲明
BOOLAPI InternetCloseHandle(_In_ HINTERNET hInternet);第一個參數
傳入要關閉的Internet句柄
返回值
如果成功關閉句柄,則返回TRUE,否則返回FALSE。要獲取擴展的錯誤信息,請調用 GetLastError。
補充:
該函數將終止句柄上的所有掛起操作,并丟棄所有未完成的數據。
只要不進行或將使用該句柄進行API調用,就可以安全地調用InternetCloseHandle。一旦API返回了ERROR_IO_PENDING,只要沒有后續使用該句柄的API調用,調用InternetCloseHandle即可取消該I / O。
在關閉句柄的回調中調用InternetCloseHandle是安全的。如果為關閉的句柄注冊了狀態回調,并且使用非NULL上下文值創建了句柄,則將進行INTERNET_STATUS_HANDLE_CLOSING回調。該指示將是從句柄進行的最后一次回調,并指示該句柄已被破壞。
如果該句柄或其任何子句柄的異步請求正在等待處理,則該句柄無法立即關閉,但將無效。嘗試使用該句柄的任何新請求都將返回 ERROR_INVALID_HANDLE通知。異步請求將以INTERNET_STATUS_REQUEST_COMPLETE完成。在發出最終的INTERNET_STATUS_HANDLE_CLOSING指示之前,應用程序必須準備好接收該句柄上的任何INTERNET_STATUS_REQUEST_COMPLETE指示,該指示表明該句柄已完全關閉。
應用程序可以調用 GetLastError來確定請求是否未決。如果 GetLastError返回ERROR_IO_PENDING,則在關閉句柄時存在未完成的請求。
與WinINet API的所有其他方面一樣,不能從DllMain或全局對象的構造函數和析構函數中安全地調用此函數。
代碼實現:
#include<windows.h> #include<wininet.h> #include<iostream> using namespace std; #pragma comment(lib,"wininet.lib") void main() {DWORD byteread = 0;char buffer[100];memset(buffer, 0, 100);HINTERNET internetopen;internetopen = InternetOpen("test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (internetopen == NULL) {cout << "Internet open failed!" << endl;return;}HINTERNET internetopenurl;internetopenurl = InternetOpenUrl(internetopen, "https://www.ivsky.com/tupian/brussels_v62535/pic_1011959.html#al_tit", NULL, 0, INTERNET_FLAG_RELOAD, 0);if (internetopenurl == NULL) {cout << "Internet open url failed!" << endl;goto there;}BOOL hwrite;DWORD written;HANDLE createfile;createfile = CreateFile("彪哥出品,必為廢品.jpg", GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);if (createfile == INVALID_HANDLE_VALUE) {cout << "Create File failed!" << endl;goto next;}BOOL internetreadfile;while (1) {internetreadfile = InternetReadFile(internetopenurl, buffer, sizeof(buffer), &byteread);if (byteread == 0)break;hwrite = WriteFile(createfile, buffer, sizeof(buffer), &written, NULL);if (hwrite == 0) {cout << "Write to file failed!" << endl;goto here;}}cout << "Finished downloading!" << endl;here:CloseHandle(createfile); next:InternetCloseHandle(internetopenurl); there:InternetCloseHandle(internetopen); }
總結
以上是生活随笔為你收集整理的InternetOpen InternetOpenUrl InternetReadFile 和 InternetCloseHandle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dll注入之SetWindowsHook
- 下一篇: IgniteMe debug 寒