Настройка интернет-прокси в IE при активном коммутируемом соединении или vpn-соединении в delphi - PullRequest
1 голос
/ 26 января 2011

Я хочу установить прокси-соединение в действии для IE с кодами Delphi.Я проверяю этот код:

Procedure SetProxy(const Server: String);
var
  Reg : TRegistry;
begin
  Reg := TRegistry.Create;
  Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings',False);
  Reg.WriteString('ProxyServer',Server);
  Reg.WriteBool('ProxyEnable',True);
  Reg.CloseKey;
  Reg.Free;
  InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
end;

Но это только изменение Настройка локальной сети в IE Интернет-опция .

У кого-нибудь есть решение для этого?

Дополнительно: Как получить список имен подключений?

1 Ответ

7 голосов
/ 26 января 2011

Амин, в своем коде вы устанавливаете глобальный прокси-сервер. Настройки для каждого соединения хранятся в этом месте HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections в двоичном формате, который не очень хорошо документирован, поэтому вы должны выяснить формат и положение для записи правильных данных.

Вместо реестра Windows вы можете использовать функцию InternetSetOption, проверьте этот пример приложения, которое обновляет конфигурацию прокси для определенного соединения.

program UpdateProxyApp;

{$APPTYPE CONSOLE}

uses
  WinInet,
  Windows,
  SysUtils;

type
INTERNET_PER_CONN_OPTION = record
    dwOption: DWORD;
    Value: record
    case Integer of
    1: (dwValue: DWORD);
    2: (pszValue: PAnsiChar);
    3: (ftValue: TFileTime);
    end;
end;

LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;
INTERNET_PER_CONN_OPTION_LIST = record
  dwSize: DWORD;
  pszConnection: LPTSTR;
  dwOptionCount: DWORD;
  dwOptionError: DWORD;
  pOptions: LPINTERNET_PER_CONN_OPTION;
end;

const
 INTERNET_PER_CONN_FLAGS = 1;
 INTERNET_PER_CONN_PROXY_SERVER = 2;
 INTERNET_PER_CONN_PROXY_BYPASS = 3;
 INTERNET_PER_CONN_AUTOCONFIG_URL = 4;
 INTERNET_PER_CONN_AUTODISCOVERY_FLAGS = 5;
 PROXY_TYPE_DIRECT = $00000001; 
 PROXY_TYPE_PROXY = $00000002; 
 PROXY_TYPE_AUTO_PROXY_URL = $00000004; 
 PROXY_TYPE_AUTO_DETECT = $00000008; 
 INTERNET_OPTION_REFRESH = 37;
 INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
 INTERNET_OPTION_SETTINGS_CHANGED = 39;

function SetConnectionProxy(const conn_name, proxy_addr : AnsiString) : Boolean;
var
    list     : INTERNET_PER_CONN_OPTION_LIST;
    dwBufSize: DWORD;
    Options  : array[0..2] of INTERNET_PER_CONN_OPTION;
begin
    dwBufSize   := SizeOf(list);
    list.dwSize := dwBufSize;
    list.pszConnection := PAnsiChar(conn_name);
    list.dwOptionCount := 3;
    list.pOptions      := @Options;

    // Set the flags
    Options[0].dwOption      := INTERNET_PER_CONN_FLAGS;
    Options[0].Value.dwValue := PROXY_TYPE_DIRECT OR PROXY_TYPE_PROXY;
    // Set proxy name
    Options[1].dwOption      := INTERNET_PER_CONN_PROXY_SERVER;
    Options[1].Value.pszValue:= PAnsiChar(proxy_addr);
    // Set proxy override .
    Options[2].dwOption      := INTERNET_PER_CONN_PROXY_BYPASS;
    Options[2].Value.pszValue:= PAnsiChar('local');

    // Set the new settings
    Result := InternetSetOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, dwBufSize);
    InternetSetOption(nil, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0);
    InternetSetOption(nil, INTERNET_OPTION_REFRESH , nil, 0);
end;


begin
  try
     Writeln(Format('Settings updated %s',[BoolToStr(SetConnectionProxy('Your connection Name', '192.168.15.15:80'),True)]));
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.
...