設定和擷取因特網選項
本主題描述如何使用 InternetSetOption 和 InternetQueryOption 函式來設定和擷取因特網選項。
您可以在指定的 HINTERNET 句柄或目前 Microsoft Internet Explorer 設定中設定或擷取因特網選項。
實作步驟
若要設定或擷取因特網選項,請完成下列動作:
選擇因特網選項
因為有許多因特網選項,所以選擇正確的選項很重要。 許多因特網選項會影響 WinINet 函式和 Internet Explorer 的行為:
例如,您可以:
- 藉由設定使用者名稱和密碼來處理基本伺服器和 Proxy 驗證。
- 設定或擷取伺服器用來識別用戶端應用程式或瀏覽器功能的使用者代理程式字串。
- 擷取指定之 HINTERNET 句柄的句柄類型。
在 Internet Explorer 5 和更新版本中,您可以使用 INTERNET_PER_CONN_OPTION_LIST 和 INTERNET_PER_CONN_OPTION 結構,從特定因特網連線設定或擷取某些選項。 如需詳細資訊和可從特定因特網連線設定或擷取的選項清單,請參閱 dwOptionsINTERNET_PER_CONN_OPTION 結構的成員。
選擇 HINTERNET 句柄
用來設定或擷取因特網選項的 HINTERNET 句柄會決定作業的範圍。 透過該句柄建立的所有句柄都會繼承在該句柄上設定的選項。
例如,需要驗證 Proxy 的用戶端應用程式,在每次應用程式嘗試存取因特網資源時,可能不需要設定 Proxy 使用者名稱和密碼。 如果指定連線上的所有要求都是由相同的 Proxy 處理,請在 HINTERNET 句柄的連線類型上設定 Proxy 使用者名稱和密碼,也就是呼叫 InternetConnect所建立的句柄,允許衍生自此 HINTERNET 句柄的任何呼叫使用相同的 Proxy 使用者名稱和密碼。 每次透過 HttpOpenRequest 創建 HINTERNET 句柄時設定 Proxy 使用者名稱和密碼,會需要不必要的額外負荷。 請注意,如果應用程式使用需要驗證的 Proxy,它應該在每個新的連線上設定 Proxy 認證。
設定或擷取選項
當您判斷要使用的因特網選項和 HINTERNET 句柄時,請擷取這些因特網選項。 若要設定或擷取選項,請呼叫 InternetQueryOption 或 InternetSetOption。
HINTERNET 句柄的範圍
用來設定或擷取因特網選項的 HINTERNET 句柄會決定選項有效的動作。
這些把手有三個層級:
- ROOT HINTERNET 句柄(由呼叫 InternetOpen所建立)會包含影響此 WinINet 實例的所有因特網選項。
- HINTERNET 句柄連接到伺服器(由呼叫 InternetConnect所建立)
- HINTERNET 與特定伺服器上的資源或資源列表相關聯的處理程序。
除了各種 HINTERNET 句柄之外,應用程式也可以使用 NULL 來設定或擷取 Internet Explorer 和 WinINet 函式所使用的因特網選項預設值。 使用 NULL 時設定因特網選項,因為句柄會變更目前儲存在登錄中的選項預設值。 用戶端應用程式不應該使用登錄函式來變更因特網選項的預設值,因為未來可以變更儲存選項的方式實作。
下表列出 HINTERNET 句柄的類型,以及與其相關聯的因特網選項範圍。
操作類型 | 範圍 |
---|---|
NULL | Internet Explorer 的預設選項設定。 |
INTERNET_HANDLE_TYPE_CONNECT_FTP | 這個連線至 FTP 伺服器的選項設定。 這些選項會影響從這個 HINTERNET 句柄起始的任何作業,例如檔案下載。 |
INTERNET_HANDLE_TYPE_CONNECT_GOPHER | 此連線至 Gopher 伺服器的選項設定。 這些選項會影響從這個 HINTERNET 句柄起始的任何作業,例如檔案下載。
注意:僅 Windows XP 和 Windows Server 2003 R2 和更早版本。 |
網路處理器類型_連接_HTTP | 連線至 HTTP 伺服器的設定選項。 這些選項會影響從這個 HINTERNET 句柄起始的任何作業,例如檔案下載。 |
網路處理類型_檔案請求 | 與此檔案要求相關聯的選項設定。 |
因特網句柄類型_FTP文件 | 與此 FTP 資源下載相關聯的選項設定。 |
INTERNET_HANDLE_TYPE_FTP_FILE_HTML | 與這個 FTP 資源相關聯的選項設定會以 HTML 格式下載。 |
INTERNET_HANDLE_TYPE_FTP_FIND | 與 FTP 伺服器上檔案搜尋相關聯的選項設定。 |
INTERNET_HANDLE_TYPE_FTP_FIND_HTML(FTP查找HTML的網路操作類型) | 與此搜尋之 FTP 伺服器上的 HTML 格式檔案相關聯的選項設定。 |
網際網路_控制代碼_地鼠_檔案 | 與此 Gopher 資源下載相關聯的選項設定。
注意: 僅適用於 Windows XP、Windows Server 2003 R2 和更早的版本。 |
GOPHER文件類型_HTML (INTERNET_HANDLE) | 與此 Gopher 資源相關聯的選項設定會以 HTML 格式下載。
注意: 適用於 Windows XP、Windows Server 2003 R2 和更早版本的操作系統。 |
INTERNET_HANDLE_TYPE_GOPHER_FIND | 與 Gopher 伺服器上檔案搜尋相關聯的選項設定。
注意:僅 Windows XP 和 Windows Server 2003 R2 和更舊版本。 |
INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML | 與 Gopher 伺服器上以 HTML 格式化之檔案搜尋相關聯的選項設定。
注意:僅適用於 Windows XP、Windows Server 2003 R2 及更早版本。 |
INTERNET_HANDLE_TYPE_HTTP_REQUEST | 與此 HTTP 要求相關聯的選項設定。 |
INTERNET_HANDLE_TYPE_INTERNET | 與 WinINet 函式實例相關聯的選項設定。 |
設定個別選項
決定您想要設定的因特網選項,以及您想要受這些選項影響的範圍之後,設定因特網選項並不複雜。 您只需要呼叫 InternetSetOption 函式,帶上您想要的 HINTERNET 句柄、因特網選項旗標,以及包含您要設定的資訊的緩衝區。
下列範例示範如何在指定的 HINTERNET 句柄上設定 Proxy 使用者名稱和密碼。
// strUsername is a string buffer of cchMax characters or less.
// It contains the proxy user name.
size_t cchMax = 80;
size_t cchUserLength, cchPasswordLength;
HRESULT hr = StringCchLength(strUsername, cchMax, &cchUserLength);
if (SUCCEEDED(hr))
{
// hOpen is the HINTERNET handle created by InternetConnect.
InternetSetOption(hConnect, INTERNET_OPTION_PROXY_USERNAME,
strUsername, DWORD(cchUserLength)+1);
}
else
{
// Insert error handling code here.
}
// strPassword is the string buffer that contains the proxy password.
hr = StringCchLength(strPassword, cchMax, &cchPasswordLength);
InternetSetOption(hOpen, INTERNET_OPTION_PROXY_PASSWORD,
strPassword, DWORD(cchPasswordLength)+1);
擷取個別選項
您可以使用 internetQueryOption函式擷取因特網選項。 若要擷取因特網選項:
判斷擷取因特網選項資訊所需的緩衝區大小。
緩衝區大小可以使用 NULL 來決定緩衝區位址,並將緩衝區大小傳遞為零。
DWORD dwSize; InternetQueryOption(NULL, INTERNET_OPTION_USER_AGENT, NULL, &dwSize);
InternetQueryOption 所傳回的值是擷取資訊所需的記憶體數量,以位元組為單位。
分配緩衝區的記憶體。
char *lpszData; lpszData = new char[dwSize];
擷取數據。
InternetQueryOption( NULL, INTERNET_OPTION_USER_AGENT, lpszData, &dwSize );
釋放記憶體。
delete [] lpszData;
完整範例
以下是上一節中使用的完整範例。 此範例示範如何擷取預設使用者代理程式字串。
// This call determines the required buffer size.
DWORD dwSize;
InternetQueryOption(NULL, INTERNET_OPTION_USER_AGENT, NULL, &dwSize);
// Allocate the necessary memory.
char *lpszData;
lpszData = new char[dwSize];
// Call InternetQueryOption again with the provided buffer.
InternetQueryOption( NULL,
INTERNET_OPTION_USER_AGENT,
lpszData, &dwSize );
// Insert code here to use the user agent string data.
// Free the allocated memory.
delete [] lpszData;
設定連線選項
在 Internet Explorer 5 和更新版本中,可以在特定連線上設定因特網選項。 先前,所有連線都共用相同的因特網選項設定。 若要設定特定連線的選項:
- 建立 INTERNET_PER_CONN_OPTION_LIST 結構。
- 為您要為連線設定的個別因特網選項配置記憶體。
- 在 INTERNET_PER_CONN_OPTION 結構中設定選項。
- 使用 InternetSetOption設定選項。
下列程式代碼範例示範如何設定LAN 連線的 Proxy 數據。
BOOL SetConnectionOptions()
{
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill the list structure.
list.dwSize = sizeof(list);
// NULL == LAN, otherwise connectoid name.
list.pszConnection = NULL;
// Set three options.
list.dwOptionCount = 3;
list.pOptions = new INTERNET_PER_CONN_OPTION[3];
// Ensure that the memory was allocated.
if(NULL == list.pOptions)
{
// Return FALSE if the memory wasn't allocated.
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
PROXY_TYPE_PROXY;
// Set proxy name.
list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
list.pOptions[1].Value.pszValue = TEXT("https://proxy:80");
// Set proxy override.
list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
list.pOptions[2].Value.pszValue = TEXT("local");
// Set the options on the connection.
bReturn = InternetSetOption(NULL,
INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// Free the allocated memory.
delete [] list.pOptions;
return bReturn;
}
擷取連線選項
在 Internet Explorer 5 和更新版本中,可以從特定連線擷取因特網選項。 若要從特定連線擷取選項:
- 建立 INTERNET_PER_CONN_OPTION_LIST 結構。
- 為個別的因特網選項分配記憶體,以便從連線中取得。
- 使用 INTERNET_PER_CONN_OPTION 結構來指定選項。
- 使用 InternetQueryOption擷取選項。
- 使用選項資料。
- 使用 GlobalFree 函式,釋放分配用來存放選項數據的記憶體。
注意
WinINet 不支援伺服器實作。 此外,不應該透過服務來使用。 針對伺服器實作或服務,請使用 Microsoft Windows HTTP 服務 (WinHTTP)。