Как приложение Delphi может обнаружить настройки сетевого прокси на ПК с Windows?

У меня есть приложение Delphi, которое взаимодействует с веб-серверами в Интернете с помощью компонентов Indy. Большинство пользователей приложения имеют прямое подключение к Интернету, но некоторые находятся за прокси-сервером локальной сети. Я не хочу просить пользователей искать их прокси-сервер в Свойства обозревателя/Подключения/Параметры локальной сети

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

поскольку, откровенно говоря, большинство людей не будут знать или заботиться о том, что это за настройка.

Могу ли я получить эту информацию через некоторые системные вызовы из приложения Delphi-7?

Большое спасибо!


person devstopfix    schedule 06.01.2010    source источник


Ответы (4)


Через WinAPI -- WinHttpGetIEProxyConfigForCurrentUser. Вы должны любить длинные имена WINAPI MS ^_^.

После редактирования OP: вы можете прочитать из реестра, AFAIR он будет находиться здесь:

 [ HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings ]
person Kornel Kisielewicz    schedule 06.01.2010
comment
+1, но если я не ошибаюсь, это только для IE. Firefox и другие браузеры поддерживают свои собственные настройки прокси. - person Pekka; 06.01.2010
comment
Это правда, но я предположил, что если ОП хочет получить это через системные вызовы, то это то, что ему нужно. - person Kornel Kisielewicz; 06.01.2010
comment
Спасибо! Теперь я знаю, что искать, я нашел код здесь: coding.derkeiler.com/Archive/Delphi/ - person devstopfix; 12.01.2010

Код Delphi для Корнела Кисилевича ответ:

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;
person Community    schedule 12.01.2010
comment
NB: TRegistry.ReadString(): если запись реестра содержит что-то отличное от строки, возникает исключение. - person devstopfix; 13.01.2010

Вот еще один метод, который я использую, не требующий прямого доступа к реестру. Это работает в D2007, но я не понимаю, почему это не работает в 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;
person Conor Boyd    schedule 12.01.2010
comment
Было бы неплохо узнать определение вашей функции SubStr, так как здесь это не совсем очевидно. - person mj2008; 31.07.2012
comment
@ mj2008: это ссылка на функцию в модуле madStrings.pas из библиотеки обработки исключений madExcept. Вы можете найти онлайн-справку здесь: help.madshi.net/StringSub.htm - person Conor Boyd; 01.08.2012

Вам нужно будет получить настройку прокси-сервера из браузера, который может находиться в нескольких разных местах в зависимости от используемого браузера.

Вы можете изучить протокол автообнаружения веб-прокси, который автоматически определяет настройки прокси в сети.

person Dave Swersky    schedule 06.01.2010
comment
Пользователи определенно будут использовать IE :), но спасибо за ссылку! - person devstopfix; 13.01.2010