DetailPage-MSS-KB

Base de Dados de Conhecimento

Artigo: 226473 - Última revisão: terça-feira, 10 de Abril de 2007 - Revisão: 4.0

 

Sumário

Este artigo explica os passos necessários para consultar e definir as informações de definição de proxy para o Internet Explorer através de programação.

Em Internet Explorer 4.x e anteriores, o InternetSetOption e InternetQueryOption API são utilizados com o sinalizador INTERNET_OPTION_PROXY. Enquanto esta opção vai continuar em Internet Explorer 5, várias opções de ligação foram introduzidas na nova versão. Com isto, o sinalizador INTERNET_OPTION_PROXY devolverá apenas o servidor proxy "estático" definição. A opção estática é as informações de servidor proxy armazenadas sob o ramo de registo HKEY_CURRENT_USER muito da mesma forma que estava no Internet Explorer 4.0

Nota INTERNET_OPTION_PROXY não altera permanentemente as definições. Isto acontece para o processo actual apenas quando é utilizado um identificador NULL. No entanto, este pode também alterar as definições num regime por sessão se for enviado um identificador de sessão válida (sessão alças são obtidas utilizando a API InternetOpen()).

Se em Internet Explorer 5, especificou uma opção de ligação diferente (tal como uma marcação de ligação) como a predefinição, é possível que as informações de proxy que obterá utilizando o INTERNET_OPTION_PROXY sinalizar pode estar incorrecta para a sessão actual do Internet Explorer. Por este motivo, em Internet Explorer 5, recomenda-se que seja utilizado o INTERNET_OPTION_PER_CONNECTION_OPTION.

Nota INTERNET_OPTION_PER_CONNECTION_OPTION faz com que as definições para ser alterado numa base de todo o sistema quando é utilizado um identificador NULL. Para reflectir correctamente as definições de proxy global, tem de chamar a função InternetSetOption com o sinalizador de opção INTERNET_OPTION_REFRESH. Ou, para especificar as definições num regime por sessão, pode ser utilizado um identificador de sessão válido.

Nota É ainda possível alterar informações de proxy para o processo de whgke sem afectar as definições de computador global no Internet Explorer 5 e versões posteriores. Para efectuar este procedimento, tem de chamar a função InternetSetOption no identificador devolvido pela função InternetOpen utilizando a opção INTERNET_OPTION_PER_CONNECTION_OPTION. O exemplo de código seguinte altera o proxy para todo o processo mesmo que o identificador de hInternet está fechado e não é utilizado para o pedido actual.
HINTERNET hInternet = InternetOpen(szAppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, ...);
InternetCloseHandle (hInternet);

Mais Informação

Em Internet Explorer 4.x, um mecanismo típico para consultar as informações de proxy teria o aspecto semelhante ao seguinte:
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());
				
Em Internet Explorer 5, a forma recomendada consiste em utilizar código semelhante ao abaixo:
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);
				
o código acima Especifica a ligação, definindo a cadeia pszConnection na estrutura INTERNET_PER_CONN_OPTION_LIST. Ao definir esta cadeia para NULL, as informações de configuração serão obtidas predefinido (ou rede local) as definições.

A primeira opção (opção [0] INTERNET_PER_CONN_AUTOCONFIG_URL) devolverá o URL especificado para configuração automática do servidor proxy. A segunda opção (opção INTERNET_PER_CONN_AUTODISCOVERY_FLAG [1]) irá detectar se detectar o automaticamente está activada ou não para a ligação especificada. A terceira opção irá determinar qual a combinação dos sinalizadores definidos para esta ligação específica. As duas últimas opções correspondem às mesmas informações como whe obtido INTERNET_OPTION_PROXY foi utilizado no Internet Explorer 4.x.

Como pode também verificar, as opções que podem potencialmente devolver valores de cadeia são libertadas utilizando GlobalFree(). Isto deve-se ao facto as memórias intermédias cadeia são atribuídas por si pela biblioteca de WININET e, cabe ao programador para libertar a memória intermédia depois utilizá-lo.

Para obter informações para uma ligação diferente, basta alterar a cadeia List.pszConnection aponte para a entrada de definição Dial-up está interessado-lo.

Do mesmo modo, para definir informações do proxy, tem de utilizar a mesma técnica, mas com InternetSetOption() em vez disso, por exemplo:
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());

				
única novamente, o exemplo acima irá alterar as predefinido (ou rede local) definições (List.pszConnection == NULL). No exemplo, as informações do servidor proxy "estático" são alteradas para "http://myproxy" na porta 8080. Do mesmo modo também pode alterar o URL de configuração automática:
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());
				
quando configurar o Internet Explorer para utilizar um servidor proxy para HTTP e ir directo para outros protocolos, utilizar o código a seguir.

Nota A memória intermédia que é transmitida para INTERNET_PER_CONN_PROXY_SERVER tem as definições para cada protocolo (este código define apenas HTTP e todos os outros ligação directa de utilização de protocolos).

Nota O INTERNET_PER_CONN_FLAGS define o valor para ambos os tipos de proxy (directamente e através de proxy) um elemento de matriz de lista de opções, conforme é ilustrado abaixo no código.

Nota Terá de ou estes sinalizadores no mesmo local. Se colocar estes sinalizadores no outro elemento de lista, estes serão apresentados correctamente (Internet Explorer OPTIONS), mas apenas um dos sinalizadores (a primeira estiver definida) irá funcionar.
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; 

}
				
no exemplo acima (definição de rede local ou novamente a predefinição), tem de especificar o URL de configuração de proxy automática e definir o sinalizador de opção para activar a configuração automática do proxy.

Referências

Documentação do WinInet API da MSDN, Abril de 1999

A informação contida neste artigo aplica-se a:
  • 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)
Palavras-chave: 
kbmt kbhowto KB226473 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 226473  (http://support.microsoft.com/kb/226473/en-us/ )
Artigo KB retiradoExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.
Partilhar
Opções de suporte adicionais
Fóruns de Suporte da Comunidade Microsoft
Contacte-nos directamente
Encontre um parceiro certificado Microsoft
Loja Microsoft