如何以程式設計方式查詢及設定 Internet Explorer] 之下的 Proxy 設定值

文章翻譯 文章翻譯
文章編號: 226473 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

本文說明要以程式設計方式查詢及設定 Proxy 設定資訊,Internet Explorer 的步驟所需。

在 [Internet Explorer 4.x 及更早的版本,InternetSetOption 和 InternetQueryOption API 用 INTERNET_OPTION_PROXY 旗標。 雖然這個選項仍會在 Internet Explorer 5 下運作,多個連線選項有被新的版本中引進了。指定這,INTERNET_OPTION_PROXY 旗標將會傳回只 「 靜態 」 的 Proxy 伺服器設定。靜態選項是儲存在 HKEY_CURRENT_USER Hive 下很多它已在網際網路總管 4.0 下以相同方式的 Proxy 伺服器資訊

附註INTERNET_OPTION_PROXY 並不會永久變更設定值。它會為目前的處理序只有在使用 NULL 的控制代碼時。不過,它也可以變更每個工作階段為基礎設定如果有效的工作階段控制代碼傳送 (工作階段使用 InternetOpen() API 取得控點) 中。

如果在 Internet Explorer 5 之下指定不同的連接選項 (如撥號連線) 為預設值,可能取得使用 「 INTERNET_OPTION_PROXY 的 Proxy 資訊旗標可能是不正確針對目前的 Internet Explorer 工作階段。 基於這個原因在 Internet Explorer 5 下它會建議您使用 [INTERNET_OPTION_PER_CONNECTION_OPTION。

附註INTERNET_OPTION_PER_CONNECTION_OPTION 會造成使用 NULL 的控制代碼時,變更全系統為基礎設定。若要正確地反映全域 Proxy 設定,您必須呼叫 InternetSetOption 函式具有 INTERNET_OPTION_REFRESH 選項旗標。或者,若要設定每個工作階段為基礎,可使用有效的工作階段控制代碼。

附註則仍可能變更 whgke 程序的 Proxy 資訊,而不會影響在 Internet Explorer 5 和更新版本的全域機器設定。若要執行此動作,您必須使用 INTERNET_OPTION_PER_CONNECTION_OPTION 選項 InternetOpen 函式會傳回該控點上呼叫 InternetSetOption 函式。即使 hInternet 控點就會關閉,而且不能用於實際要求,下列的程式碼範例會變更整個處理序 Proxy。
HINTERNET hInternet = InternetOpen(szAppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, ...);
InternetCloseHandle (hInternet);

其他相關資訊

在 [Internet Explorer 4.x 典型機制來查詢 Proxy 資訊會起來像這樣:
unsigned long        nSize = 4096;
char                 szBuf[4096] = { 0 };
INTERNET_PROXY_INFO* pInfo = (INTERNET_PROXY_INFO*)szBuf;

if(!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pInfo, &nSize))
   printf("InternetQueryOption failed! (%d)\n", GetLastError());
				
在 Internet Explorer 5 下建議的方式是使用類似下面程式碼:
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[5];
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[1].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
Option[2].dwOption = INTERNET_PER_CONN_FLAGS;
Option[3].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
Option[4].dwOption = INTERNET_PER_CONN_PROXY_SERVER;

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 5;
List.dwOptionError = 0;
List.pOptions = Option;

if(!InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
   printf("InternetQueryOption failed! (%d)\n", GetLastError());
   if(Option[0].Value.pszValue != NULL)
   printf("%s\n", Option[0].Value.pszValue);

if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) == PROXY_TYPE_AUTO_PROXY_URL)
  printf("PROXY_TYPE_AUTO_PROXY_URL\n");

if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_DETECT) == PROXY_TYPE_AUTO_DETECT)
   printf("PROXY_TYPE_AUTO_DETECT\n");

INTERNET_VERSION_INFO      Version;
nSize = sizeof(INTERNET_VERSION_INFO);

InternetQueryOption(NULL, INTERNET_OPTION_VERSION, &Version, &nSize);

if(Option[0].Value.pszValue != NULL)
   GlobalFree(Option[0].Value.pszValue);

if(Option[3].Value.pszValue != NULL)
   GlobalFree(Option[3].Value.pszValue);

if(Option[4].Value.pszValue != NULL)
   GlobalFree(Option[4].Value.pszValue);
				
上面的程式碼在 INTERNET_PER_CONN_OPTION_LIST 結構設定 pszConnection 字串的指定連接。藉由將這個字串設定為 NULL,設定資訊將會擷取預設 (或 LAN) 設定。

第一個選項 (選項 [0] INTERNET_PER_CONN_AUTOCONFIG_URL) 會傳回指定自動組態的 Proxy 伺服器的 URL。 第二個選項 (選項 [1] INTERNET_PER_CONN_AUTODISCOVERY_FLAG) 將會偵測是否自動偵測] 選項已啟用] 或 [不是針對指定的連接。 第三個選項會決定哪些組合的旗標已設定這個特定的連線。 擷取的 whe INTERNET_OPTION_PROXY 因為使用 Internet Explorer 4.x 中為最後兩個選項會對應到相同的資訊。

您也發現潛在可傳回字串值的選項,會釋出使用 GlobalFree()。 這是因為字串緩衝區會配置為您 WININET 文件庫,完全由程式設計人員以釋出緩衝區之後使用它。

若要取得不同的連線資訊,只是變更 List.pszConnection 字串以指到 [撥號設定項目是想要它。

同樣地,設定 Proxy 資訊,您會使用相同的技巧但 InternetSetOption() 改,例如:
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[1];
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
Option[0].Value.pszValue = "http://myproxy:8080";

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 1;
List.dwOptionError = 0;
List.pOptions = Option;

if(!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
   printf("InternetQueryOption failed! (%d)\n", GetLastError());

				
一次重新上述範例會變更預設 (或 LAN) 設定 (List.pszConnection = = NULL)。在範例中 「 靜態 」 的 Proxy 伺服器的資訊變更為"http://myproxy 」 在連接埠 8080。 同樣地也可以變更自動設定 URL:
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[2];
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[0].Value.pszValue = "http://myserver/get_proxy_info.dll";
Option[1].dwOption = INTERNET_PER_CONN_FLAGS;
Option[1].Value.dwValue = PROXY_TYPE_AUTO_PROXY_URL;

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 2;
List.dwOptionError = 0;
List.pOptions = Option;

if(!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
   printf("InternetQueryOption failed! (%d)\n", GetLastError());
				
當您設定用於 HTTP Proxy 伺服器,並直接其他通訊協定的 Internet Explorer 時,使用程式碼,請遵循。

附註傳遞至 INTERNET_PER_CONN_PROXY_SERVER 的緩衝區有 (此程式碼會設定唯一 HTTP 和所有其他通訊協定使用直接連線) 每個通訊協定的設定。

附註[INTERNET_PER_CONN_FLAGS 設定值對於這兩種 Proxy 類型 (直接及透過 Proxy) 的選項清單 Array 的一個項目中如下所示在程式碼中。

附註您不必 OR 這些旗標在同一個地方。如果您將這些旗標放在另一個清單項目時,它們將會顯示正確 (網際網路總管 OPTIONS) 但只有其中一個旗標 (設定在第一個) 將會運作。
int main(int argc, char * argv[]) 
{ 
char buff[256] = "http=http://<ProxyServerName>:80"; 
// To include server for FTP, HTTPS, and so on, use the string
// (ftp=http://<ProxyServerName>:80; https=https://<ProxyServerName>:80) 
INTERNET_PER_CONN_OPTION_LIST    List; 
INTERNET_PER_CONN_OPTION         Option[3]; 
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST); 

Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; 
Option[0].Value.pszValue = buff; 

Option[1].dwOption = INTERNET_PER_CONN_FLAGS; 
Option[1].Value.dwValue = PROXY_TYPE_PROXY; 
Option[1].Value.dwValue |= PROXY_TYPE_DIRECT; 
// This option sets all the possible connection types for the client. 
// This case specifies that the proxy can be used or direct connection is possible.

Option[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; 
Option[2].Value.pszValue = "<local>"; 

 

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST); 
List.pszConnection = NULL; 
List.dwOptionCount = 3; 
List.dwOptionError = 0; 
List.pOptions = Option; 

if(!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize)) 
printf("InternetSetOption failed! (%d)\n", GetLastError()); 

InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL,NULL); 
//The connection settings for other instances of Internet Explorer. 

return 0; 

}
				
(一次預設或區域網路設定) 的上方範例中, 您必須指定自動 Proxy 組態 URL,並設定選項旗標,以啟用自動 Proxy 組態。

?考

MSDN Wininet API 文件,四月 1999

屬性

文章編號: 226473 - 上次校閱: 2007年4月10日 - 版次: 4.0
這篇文章中的資訊適用於:
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 5.0
  • Microsoft Windows Internet Services (WinInet)
關鍵字:?
kbmt kbhowto KB226473 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:226473
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com