Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2575
  • Last Modified:

Set proxy in IE

Hello,
I need two simple procedures for delphi which one of them sets proxy in IE and another one disables the proxy in IE. the proxy should be set for all dial up and LAN connections , not just for LAN , something like this :
SetProxy('localhost:8080');
DisableProxy;
I've done my homework and I think this thread will help a lot :
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21707537.html
seems it should be done with InternetSetOption().
but I dont feel comfortable with windows APIs :D
Regards
0
fifthelement80
Asked:
fifthelement80
  • 4
  • 2
1 Solution
 
smotCommented:
function SetProxy(UserAgent, Address, UserName, Password: string; Port: integer): Boolean;
var
  list: INTERNET_PER_CONN_OPTION_LIST;
  dwBufSize: DWORD;
  hInternet, hInternetConnect: Pointer;
  Options: array[1..3] of INTERNET_PER_CONN_OPTION;
begin
  Result := False;
  dwBufSize := SizeOf(list);
  list.dwSize := SizeOf(list);
  list.pszConnection := nil;
  list.dwOptionCount := High(Options);
  Options[1].dwOption := INTERNET_PER_CONN_FLAGS;
  Options[1].Value.dwValue := PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
  Options[2].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
  Options[2].Value.pszValue := PAnsiChar(string(Address));
  Options[3].dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
  Options[3].Value.pszValue := '<local>';
  list.pOptions := @Options;
  hInternet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if hInternet <> nil then
  try
    hInternetConnect := InternetConnect(hInternet, PChar(Address), Port, PChar(UserName), PChar(Password),
      INTERNET_SERVICE_HTTP, 0, 0);
    if hInternetConnect <> nil then
    begin
      Result := InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, dwBufSize);
      if Result then
        Result := InternetSetOption(hInternet, INTERNET_OPTION_REFRESH, nil, 0);
    end;
  finally
    InternetCloseHandle(hInternet)
  end;
end;

function DisableProxy(): Boolean;
var
  list: INTERNET_PER_CONN_OPTION_LIST;
  dwBufSize: DWORD;
  hInternet: Pointer;
  Options: array[1..3] of INTERNET_PER_CONN_OPTION;
begin
  Result := False;
  dwBufSize := SizeOf(list);
  list.dwSize := SizeOf(list);
  list.pszConnection := nil;
  list.dwOptionCount := High(Options);
  Options[1].dwOption := INTERNET_PER_CONN_FLAGS;
  Options[1].Value.dwValue := PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
  Options[2].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
  Options[2].Value.pszValue := PAnsiChar('');
  Options[3].dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
  Options[3].Value.pszValue := '<local>';
  list.pOptions := @Options;
  hInternet := InternetOpen(PChar(''), INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if hInternet <> nil then
  try
    Result := InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, dwBufSize);
    if Result then
      Result := InternetSetOption(hInternet, INTERNET_OPTION_REFRESH, nil, 0);
  finally
    InternetCloseHandle(hInternet)
  end;
end;

0
 
fifthelement80Author Commented:
I added the WinInet to uses clause , but INTERNET_PER_CONN_OPTION_LIST is still undeclared , are you using any other units to declare these identifiers ?
0
 
smotCommented:
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
fifthelement80Author Commented:
I did , first the structure INTERNET_PER_CONN_OPTION , didnt have a .value.dwValue , so I removed .value part from the code and changed the code to this :

  Options[1].dwOption := INTERNET_PER_CONN_FLAGS;
  Options[1].dwValue := PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
  Options[2].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
  Options[2].pszValue := PAnsiChar(string(Address));
  Options[3].dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
  Options[3].pszValue := '<local>';
  list.pOptions := @Options;

then it was giving error on this line :
  Options[2].pszValue := PAnsiChar(string(Address));
Incompatible type 'AnsiChar' and 'Char'

so I changed it to :
  Options[2].pszValue := PChar(string(Address));

and it compiled fine , then I called the procedure by following command :
SetProxy('','localhost','','',8080);

but it didnt work :( I am using delphi 2009
0
 
SaTaXCommented:
I do not see why doing so much with all those hard keys.

You can simply do this with registry keys. Internet Explorer adds and removes registry keys to get it worked. Don't forget the proxy will be applied on browsers and internet activities.

Here it is:
This uses registry and wininet.

Procedure SetProxy(cost 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;

This is how to use:
SetProxy('Proxy:Port');



Procedure 2 to disable:

Procedure DisableProxy;
var
  Reg : TRegistry;
begin
  Reg := TRegistry.Create;
  Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings',False);
  Reg.WriteBool('ProxyEnable,False);
  Reg.CloseKey;
  Reg.Free;
  InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);
end;

This is how to use:
DisableProxy;


If IE is running and those new proxy settings are applied, IE will not read the new settings.
To get the new settings it'll need to not have Internet explorer open.
So if the user has InternetExplorer Running you can use read_internet procedure:

procedure IE_Read;
var
  HInet: HINTERNET;
begin
  hInet := InternetOpen(PChar('myappname'), INTERNET_OPEN_TYPE_DIRECT,
    nil, nil, INTERNET_FLAG_OFFLINE);
  try
    if hInet <> nil then
      InternetSetOption(hInet, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0);
  finally
    InternetCloseHandle(hInet);
  end;
end;

This is how to use it:
IE_Read;
0
 
fifthelement80Author Commented:
@SaTaX : Thank you for your reply , but your solution doesn't set proxy on dial up connections and only works for LAN connection.
0
 
fifthelement80Author Commented:
I found the solution , I attach the complete code for further use.
in order to get the names of dialup connections , I user TMagRas component , here is the link to component : http://www.magsys.co.uk/delphi/magras.asp
unit proxyu;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,wininet,magrasent;
 
type
  TForm1 = class(TForm)
    SetProxybtn: TButton;
    Disableproxybtn: TButton;
    procedure SetProxybtnClick(Sender: TObject);
    procedure DisableproxybtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
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;   // direct to net
  PROXY_TYPE_PROXY          = $00000002;   // via named proxy
 
  INTERNET_OPTION_PER_CONNECTION_OPTION   = 75;
 
//--TProxy Section--------------------------------------------------------------
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;
   LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST;
 
procedure SetProxy(Con,ProxyServer: string); //mladen
var
   list: INTERNET_PER_CONN_OPTION_LIST;
   dwBufSize: DWORD;
   Options: array[1..2] of INTERNET_PER_CONN_OPTION;
begin
   dwBufSize := sizeof(list);
   list.dwSize := sizeof(list);
   list.pszConnection := pchar(Con);
   list.dwOptionCount := High(Options); // the highest index of the array (in this case 3)
   Options[1].dwOption := INTERNET_PER_CONN_FLAGS;
   Options[1].Value.dwValue := PROXY_TYPE_PROXY;
   Options[2].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
   Options[2].Value.pszValue := PansiChar(ProxyServer);
   list.pOptions := @Options;
   InternetSetOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, dwBufSize);
   InternetSetOption(nil, INTERNET_OPTION_REFRESH, nil, 0);
end;
 
procedure DisableProxy(Con:string); //mladen
var
   list: INTERNET_PER_CONN_OPTION_LIST;
   dwBufSize: DWORD;
   Options: array[1..2] of INTERNET_PER_CONN_OPTION;
begin
   dwBufSize := sizeof(list);
   list.dwSize := sizeof(list);
   list.pszConnection := pchar(Con);
   list.dwOptionCount := High(Options); // the highest index of the array (in this case 3)
   Options[1].dwOption := INTERNET_PER_CONN_FLAGS;
   Options[1].Value.dwValue := PROXY_TYPE_DIRECT;
   Options[2].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
   Options[2].Value.pszValue := PansiChar('');
   list.pOptions := @Options;
   InternetSetOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, dwBufSize);
   InternetSetOption(nil, INTERNET_OPTION_REFRESH, nil, 0);
end;
 
// End of Proxy-----------------------------------------------------------------
 
 
procedure TForm1.SetProxybtnClick(Sender: TObject);
var
  i : integer;
begin
        I := MagRasGetEntryList ('') ;
        if (i=0) then
        begin
          for I := 0 to Pred (MagRasNumEntryRec) do SetProxy(MagRasEntryRecs [I].EntryName,'localhost:8080');
        end;
        SetProxy('','localhost:8080');
end;
 
procedure TForm1.DisableproxybtnClick(Sender: TObject);
var
  i : integer;
begin
        I := MagRasGetEntryList ('') ;
        if (i=0) then
        begin
          for I := 0 to Pred (MagRasNumEntryRec) do  DisableProxy(MagRasEntryRecs [I].EntryName);
        end;
        DisableProxy('');
end;
end.

Open in new window

0

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now