2010-01-06 11 views
9

Mam aplikację Delphi, która komunikuje się z serwerami WWW w Internecie za pomocą Indy components. Większość użytkowników aplikacji ma bezpośrednie połączenia z Internetem, ale niektóre znajdują się za serwerem proxy sieci lokalnej. Nie chcę, aby poprosić użytkowników do wyszukiwania ich serwera proxy w Internet Options/Connections/LAN Settings dialogW jaki sposób aplikacja Delphi może wykryć ustawienia sieciowego serwera proxy na komputerze z systemem Windows?

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

jak szczerze mówiąc większość ludzi nie wie, czy obchodzi mnie, co to ustawienie.

Czy mogę uzyskać te informacje za pośrednictwem niektórych wywołań systemowych z aplikacji Delphi-7?

Wielkie dzięki!

Odpowiedz

13

Via WinAPI - WinHttpGetIEProxyConfigForCurrentUser. Musisz kochać długie nazwy WINAPI MS^_ ^.

Po edycji OP: można odczytać z rejestru, AFAIR byłoby znaleźć tutaj:

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

+1 ale jeśli się nie mylę, to tylko dla IE. Firefox i inne przeglądarki zachowują własne ustawienia proxy. –

+0

To prawda, ale założyłem, że jeśli OP chce dostać przez systemowe wywołania, to jest to, czego szuka. –

+1

Dziękujemy! Teraz wiem, czego szukać, znalazłem kod tutaj: http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2004-01/0205.html – devstopfix

1

Trzeba by uzyskać ustawienia serwera proxy w przeglądarce, która może być w kilku różnych miejscach w zależności od używana przeglądarka.

Możesz rozważyć zaglądanie pod numer Web Proxy Autodiscovery Protocol, który automatycznie wykrywa ustawienia proxy w sieci.

+0

Użytkownicy na pewno będą używając IE :), ale dzięki za link! – devstopfix

2

Kod Delphi for 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(): "Jeśli wpis rejestru zawiera coś innego niż ciąg, zostanie zgłoszony wyjątek." – devstopfix

3

Oto kolejny sposób, że używam, która nie wymaga bezpośredniego dostępu do rejestru. Działa to pod D2007, ale nie rozumiem, dlaczego nie działałoby pod 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

Dobrze byłoby poznać definicję twojej funkcji SubStr, ponieważ nie jest to całkowicie oczywiste. – mj2008

+1

@ mj2008: jest to odwołanie do funkcji w madStrings.pas z biblioteki obsługi wyjątków madExcept. Możesz znaleźć pomoc online tutaj: http://help.madshi.net/StringSub.htm –

Powiązane problemy