2010-01-06 18 views
9

Possiedo un'applicazione Delphi che comunica con i server Web su Internet utilizzando lo Indy components. La maggior parte degli utenti dell'applicazione ha connessioni Internet dirette, ma alcune sono dietro a un server proxy di una rete locale. Io non voglio avere a chiedere agli utenti di ricercare la loro server proxy nel Internet Options/Connections/LAN Settings dialogCome può un'applicazione Delphi rilevare le impostazioni del proxy di rete di un PC Windows?

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

come francamente maggior parte delle persone non sanno o cura ciò che questa impostazione è.

È possibile ottenere queste informazioni tramite alcune chiamate di sistema da un'applicazione Delphi-7?

Grazie mille!

risposta

13

Via WinAPI - WinHttpGetIEProxyConfigForCurrentUser. Devi amare i lunghi nomi WINAPI di MS^_ ^.

Dopo OP edit: Si può leggere dal Registro di sistema, AFAIR si troverebbe senz'altro qui:

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

+1 ma se non sbaglio, è solo per IE, però. Firefox e gli altri browser mantengono le proprie impostazioni Proxy. –

+0

Questo è vero, ma ho pensato che se l'OP vuole ottenere tramite chiamate di sistema, allora è quello che cerca. –

+1

Grazie! Ora so cosa cercare, ho trovato del codice qui: http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2004-01/0205.html – devstopfix

1

Si dovrà ottenere l'impostazione dal browser proxy, che potrebbe essere in diverse posizioni diverse a seconda il browser in uso.

Si potrebbe prendere in considerazione lo Web Proxy Autodiscovery Protocol, che rileva automaticamente le impostazioni proxy su una rete.

+0

Gli utenti saranno sicuramente usando IE :) ma grazie per il link! – devstopfix

2

Il codice Delphi per 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(): "Se la voce del Registro di sistema contiene qualcosa di diverso da una stringa, viene sollevata un'eccezione." – devstopfix

3

Ecco un altro metodo che uso, che non richiede l'accesso diretto Registro di sistema. Funziona con D2007, ma non riesco a capire perché non funzionerebbe con 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

Sarebbe utile conoscere la definizione della funzione SubStr, poiché qui non è del tutto ovvia. – mj2008

+1

@ mj2008: è un riferimento a una funzione nell'unità madStrings.pas dalla libreria di gestione delle eccezioni madExcept. Puoi trovare qualche aiuto online qui: http://help.madshi.net/StringSub.htm –

Problemi correlati