2010-01-06 36 views
9

Tengo una aplicación Delphi que se comunica con servidores web en Internet usando el Indy components. La mayoría de los usuarios de la aplicación tienen conexiones directas a Internet, pero algunos están detrás de un servidor proxy de una red local. Yo no quiero tener que pedir a los usuarios para buscar su servidor proxy en el Internet Options/Connections/LAN Settings dialog¿Cómo puede una aplicación Delphi detectar la configuración proxy de red de una PC con Windows?

alt text http://toybase.files.wordpress.com/2008/11/ie-proxy-settings.png

tan francamente la mayoría de la gente no sabe ni le importa lo que este ajuste es.

¿Puedo obtener esta información a través de algunas llamadas al sistema desde una aplicación Delphi-7?

¡Muchas gracias!

Respuesta

13

Via WinAPI - WinHttpGetIEProxyConfigForCurrentUser. Tienes que amar los nombres largos de WINAPI de MS^_ ^.

Después de OP Edición: se puede leer desde el registro, AFAIR que se encontraría aquí:

[ HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings ] 
+7

+1 pero si no me equivoco, eso solo es para IE. Firefox y los otros navegadores mantienen su propia configuración de Proxy. –

+0

Eso es cierto, pero asumí que si el OP quiere obtenerlo a través de llamadas al sistema, entonces eso es lo que busca. –

+1

¡Gracias! Ahora sé qué buscar, encontré un código aquí: http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2004-01/0205.html – devstopfix

1

que tendría que obtener la configuración de proxy desde el navegador, lo que podría estar en varios lugares diferentes en función de el navegador en uso.

Puede considerar buscar en Web Proxy Autodiscovery Protocol, que detecta automáticamente la configuración de proxy en una red.

+0

Los usuarios definitivamente serán usando IE :) pero gracias por el enlace! – devstopfix

2

El código de Delphi para Kornel Kisielewicz 's answer:

uses Registry, Windows; 

function detectIEProxyServer() : string; 
begin 
    with TRegistry.Create do 
    try 
     RootKey := HKEY_CURRENT_USER; 
     if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet Settings', False) then begin 
      Result := ReadString('ProxyServer'); 
      CloseKey; 
     end 
     else 
      Result := ''; 
    finally 
     Free; 
    end; 
end; 
+0

NB: TRegistry.ReadString(): "Si la entrada del Registro contiene algo que no sea una cadena, se genera una excepción". – devstopfix

3

Aquí hay otro método que yo uso, que no requiere acceso al registro directo. Esto funciona bajo D2007, pero no puedo ver por qué no funcionaría en D7.

uses 
    WinInet, 
    SysUtils; 

function UseIEProxyInfo(var ProxyHost: String; var ProxyPort: Integer): Boolean; 
var 
    ProxyInfo: PInternetProxyInfo; 
    Len: LongWord; 
    ProxyDetails: String; 
    s2: String; 
    i1: Integer; 

    procedure RemoveProtocol(var str: string); 
    var 
    i1 : integer; 
    begin 
    i1 := PosText('://', str); 
    if i1 > 0 then 
     Delete(str, 1, i1 + 2); 
    i1 := PosText('http=', str); 
    if i1 > 0 then begin 
     Delete(str, 1, i1 + 4); 
     str := SubStr(str, 1, ' '); 
    end; 
    end; 

begin 
    Result := False; 

    Len := 4096; 
    GetMem(ProxyInfo, Len); 
    try 
    if InternetQueryOption(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then 
    begin 
     if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then 
     begin 
     Result := True; 
     ProxyDetails := ProxyInfo^.lpszProxy; 

     RemoveProtocol(ProxyDetails); 
     s2 := SubStr(ProxyDetails, 2, ':'); 
     if s2 <> '' then 
     begin 
      try 
      i1 := StrToInt(s2); 
      except 
      i1 := -1; 
      end; 

      if i1 <> -1 then 
      begin 
      ProxyHost := SubStr(ProxyDetails, 1, ':'); 
      ProxyPort := i1; 
      end; 
     end; 
     end; 
    end; 
    finally 
    FreeMem(ProxyInfo); 
    end; 
end; 
+0

Sería bueno saber la definición de su función SubStr, ya que no es completamente obvio aquí. – mj2008

+1

@ mj2008: es una referencia a una función en la unidad madStrings.pas de la biblioteca de manejo de excepciones madExcept. Puede encontrar ayuda en línea aquí: http://help.madshi.net/StringSub.htm –

Cuestiones relacionadas