Jak programově dotazu a nastavení serveru proxy v aplikaci Internet Explorer

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Souhrn

Tento článek vysvětluje postup při programově vyhledat a nastavit informace o nastavení serveru proxy pro aplikaci Internet Explorer.

V aplikaci Internet Explorer 4.x a starší, používá rozhraní API InternetQueryOption a InternetSetOption s příznakem INTERNET_OPTION_PROXY. Při této možnosti budou stále fungovat v aplikaci Internet Explorer 5, více možností připojení byly zavedeny v nové verzi. To dán, vrátí příznak INTERNET_OPTION_PROXY pouze "statické" proxy server nastavení. Je možnost statické informace o proxy serveru uloženy v podregistru HKEY_CURRENT_USER mnohem stejným způsobem jako bylo v aplikaci Internet Explorer 4.0

Poznámka: INTERNET_OPTION_PROXY nastavení trvale nezmění. Dosahuje toho pro aktuální proces pouze v případě, že je použit NULOVÝ popisovač. Však ji můžete také změnit nastavení pro jednotlivé relace je odeslána popisovače platné relace (relace, které popisovače jsou získány pomocí rozhraní API InternetOpen()).


Pokud v aplikaci Internet Explorer 5 možnost různých připojení (například telefonické připojení) zadán jako výchozí, je možné, že informace o proxy serveru můžete získat INTERNET_OPTION_PROXY pomocí příznaku může být nesprávná pro aktuální relaci aplikace Internet Explorer. Z tohoto důvodu v rámci aplikace Internet Explorer 5 doporučujeme místo toho použít INTERNET_OPTION_PER_CONNECTION_OPTION.

Poznámka: INTERNET_OPTION_PER_CONNECTION_OPTION způsobí, že nastavení změnit na základě celého systému, pokud je použit NULOVÝ popisovač. Chcete-li správně zobrazit globální nastavení, musí volat funkci InternetSetOption s příznakem INTERNET_OPTION_REFRESH možnost. Nebo nastavení pro jednotlivé relace, relace platný popisovač lze použít.


Poznámka: Je stále možné změnit informace o serveru proxy pro proces whgke bez ovlivnění globální nastavení v aplikaci Internet Explorer 5 a novější verze. Chcete-li to provést, musíte zavolat funkci InternetSetOption na úchyt, která je vrácena pomocí metody InternetOpen funkce pomocí možnosti INTERNET_OPTION_PER_CONNECTION_OPTION. Následující příklad kódu změní proxy pro celý proces, i když hInternet popisovač je uzavřen a nebude použita pro skutečný požadavek.
HINTERNET hInternet = InternetOpen(szAppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, ...); 
InternetCloseHandle (hInternet);

Další informace

V aplikaci Internet Explorer 4.x, typický mechanismus k dotazu informace o proxy serveru by vypadat přibližně takto:
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());

V aplikaci Internet Explorer 5 doporučený způsob je použít kód podobný níže:

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);

Výše uvedený kód určuje připojení pomocí nastavení v INTERNET_PER_CONN_OPTION_LIST struktury pszConnection řetězec. Nastavením tohoto řetězce na hodnotu NULL, budou načteny informace o konfiguraci výchozí (nebo LAN) nastavení.

První možnost (možnost [0] INTERNET_PER_CONN_AUTOCONFIG_URL) vrátí adresu URL zadanou pro automatickou konfiguraci proxy serveru. Druhá možnost (možnost [1] INTERNET_PER_CONN_AUTODISCOVERY_FLAG) zjistí Autodetekce možnost je povolena, nebo není pro zadané připojení. Třetí možnost lze určit, jaké kombinace příznaků nastavených pro tento konkrétní připojení. Poslední dvě možnosti odpovídají stejné informace jako načtená kde INTERNET_OPTION_PROXY byl použit v aplikaci Internet Explorer 4.x.

Jak je také vidět, možnosti, které může potenciálně vrátit hodnoty řetězců jsou uvolněny pomocí GlobalFree(). Důvodem je přidělena vyrovnávací paměť řetězce můžete pomocí knihovny rozhraní WININET a odpovídá až programátor uvolnit vyrovnávací paměti, po jeho použití.

Získat informace pro jiné připojení, jednoduše změnit řetězec List.pszConnection, přejděte položku telefonického připojení, nastavení se zájem ji.

Podobně chcete-li nastavit informace o serveru proxy, použijte stejnou technikou, ale s InternetSetOption() místo, například:
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());


Ještě jednou se výše uvedené ukázkové změní výchozí (nebo LAN) nastavení (List.pszConnection == NULL). Ve vzorku je informace o serveru proxy "statické" změněna na "http://myproxy" na portu 8080. Podobně můžete také změnit adresu URL automatické konfigurace:
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());

Při konfiguraci aplikace Internet Explorer pro použití serveru proxy pro protokol HTTP a přímá pro jiné protokoly, použijte kód dodržovat.

Poznámka: Vyrovnávací paměti, která je předána INTERNET_PER_CONN_PROXY_SERVER obsahuje nastavení pro každý protokol (Tento kód nastaví pouze HTTP a všechny ostatní protokoly používat přímé připojení).

Poznámka: INTERNET_PER_CONN_FLAGS nastaví hodnotu pro oba typy Proxy (přímo a prostřednictvím serveru proxy) v jeden prvek pole seznamu možnost, jak je uvedeno níže v kódu.

Poznámka: Je nutné, NEBO tyto příznaky v jednom místě. Pokud umístíte tyto příznaky do jiného prvku seznamu, se zobrazí správně (MOŽNOSTI Internet Explorer), ale bude fungovat pouze jeden z příznaků (první, který je nastaven).

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;

}

V ukázce výše (znovu výchozí nastavení nebo nastavení sítě LAN) je nutné zadat URL automatické konfigurace proxy a nastavit příznak možnost povolení automatické konfigurace serveru proxy.

Odkazy

Rozhraní WinInet API dokumentaci MSDN, Duben 1999
Vlastnosti

ID článku: 226473 - Poslední kontrola: 8. 1. 2017 - Revize: 1

Váš názor