Cómo realizar consultas mediante programación y establecer la configuración de proxy en Internet Explorer

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Resumen

El artículo explica los pasos necesarios para consultar y establecer la información de configuración de proxy de Internet Explorer mediante programación.

En Internet Explorer 4.x y versiones anteriores, se utilizan los InternetSetOption y APIs de InternetQueryOption con el indicador INTERNET_OPTION_PROXY. Aunque esta opción aún funcionará en Internet Explorer 5, múltiples opciones de conexión se han introducido en la nueva versión. Teniendo esto en cuenta, el indicador INTERNET_OPTION_PROXY devolverá sólo el servidor de proxy "estático" establecer. La opción estática es la información del servidor proxy almacenada en la sección HKEY_CURRENT_USER del mismo modo estaba en Internet Explorer 4.0

Nota: INTERNET_OPTION_PROXY no cambia definitivamente la configuración. Hace esto para el proceso actual sólo cuando se utiliza un identificador NULL. Sin embargo, también puede cambiar la configuración en una base por sesión si se envía un identificador de sesión válido en (sesión de controladores se obtienen mediante la API InternetOpen()).


Si en Internet Explorer 5, se especifica una opción de conexión diferentes (por ejemplo, una conexión telefónica) como valor predeterminado, es posible que la información del proxy que se obtiene mediante el INTERNET_OPTION_PROXY indicador puede ser incorrecta para la sesión actual de Internet Explorer. Por este motivo, en Internet Explorer 5, se recomienda que el INTERNET_OPTION_PER_CONNECTION_OPTION utilizarse en su lugar.

Nota: INTERNET_OPTION_PER_CONNECTION_OPTION hace que la configuración cambiará en todo el sistema cuando se utiliza un identificador NULL. Para reflejar correctamente la configuración de proxy global, debe llamar a la función InternetSetOption con el indicador de opción INTERNET_OPTION_REFRESH. O bien, para establecer la configuración en una base por sesión, puede utilizar un identificador de sesión válido.


Nota: Es posible cambiar información de proxy para el proceso de whgke sin afectar a la configuración del equipo global en Internet Explorer 5 y versiones posteriores. Para ello, debe llamar a la función InternetSetOption en el identificador devuelto por la función InternetOpen mediante la opción INTERNET_OPTION_PER_CONNECTION_OPTION. En el ejemplo de código siguiente se cambia al proxy para todo el proceso, incluso aunque el controlador hInternet se cierra y no se utiliza para la solicitud real.
HINTERNET hInternet = InternetOpen(szAppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, ...); 
InternetCloseHandle (hInternet);

Más información

En Internet Explorer 4.x, un mecanismo habitual para consultar la información del proxy sería algo parecido a esto:
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());

En Internet Explorer 5, la forma recomendada es utilizar código similar a continuación:

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

El código anterior especifica la conexión mediante la configuración de la cadena pszConnection en la estructura INTERNET_PER_CONN_OPTION_LIST. Estableciendo esta cadena como NULL, se recuperará la información de configuración para el valor predeterminado (o LAN) configuración.

La primera opción (opción INTERNET_PER_CONN_AUTOCONFIG_URL [0]) devolverá la dirección URL especificada para la configuración automática del servidor proxy. La segunda opción (opción INTERNET_PER_CONN_AUTODISCOVERY_FLAG [1]) detectará si Autodetectar está habilitada o no para la conexión especificada. La tercera opción determinará qué combinación de indicadores se han configurado para esta conexión concreta. Las dos últimas opciones corresponden a la misma información que se utilizó cuando recuperado INTERNET_OPTION_PROXY en Internet Explorer 4.x.

Como verá, las opciones que potencialmente pueden devolver valores de cadena se liberan mediante GlobalFree(). Esto es porque los búferes de cadena se asignan automáticamente en la biblioteca de WININET y es para el programador para liberar el búfer después de usarla.

Para obtener información sobre una conexión diferente, simplemente cambie la cadena List.pszConnection para que apunte a la entrada de configuración de Dial-Up está interesado lo.

De forma similar, para establecer la información del proxy, usaría la misma técnica, pero con InternetSetOption() en su lugar, por ejemplo:
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());


Una vez más, va a cambiar el ejemplo anterior el predeterminado (o LAN) configuración (List.pszConnection == NULL). En el ejemplo, se cambia la información del servidor proxy "estático" a "http://myproxy" en el puerto 8080. Del mismo modo puede cambiar también la URL de configuración 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());

Cuando configura Internet Explorer para utilizar un servidor proxy para HTTP y vaya directo para otros protocolos, usar el código siguiente.

Nota: El búfer que se pasa al INTERNET_PER_CONN_PROXY_SERVER tiene la configuración de cada protocolo (este código establece sólo HTTP y todos los demás conexión directa del uso de protocolos).

Nota: El INTERNET_PER_CONN_FLAGS establece el valor para ambos tipos de Proxy (directa y a través de proxy) en un elemento de la matriz de lista opción, tal como se muestra a continuación en el código.

Nota: Tienes que o estos indicadores en un solo lugar. Si coloca estos indicadores en otro elemento de la lista, se mostrarán correctamente (OPCIONES de Internet Explorer), pero sólo uno de los indicadores (el primero que se establece) 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;

}

En el ejemplo anterior (otra vez, el valor predeterminado o configuración de LAN), tienes que especificar la URL de configuración de proxy automática y establecer el indicador de la opción para habilitar la configuración automática del proxy.

Referencias

Documentación de la API WinInet MSDN, abril de 1999
Propiedades

Id. de artículo: 226473 - Última revisión: 8 ene. 2017 - Revisión: 1

Comentarios