Solved

Set proxy in IE

Posted on 2008-11-01
7
2,537 Views
Last Modified: 2013-11-23
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
Comment
Question by:fifthelement80
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
7 Comments
 
LVL 3

Expert Comment

by:smot
ID: 22857425
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
 
LVL 7

Author Comment

by:fifthelement80
ID: 22857519
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
 
LVL 3

Expert Comment

by:smot
ID: 22857561
0
Independent Software Vendors: 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!

 
LVL 7

Author Comment

by:fifthelement80
ID: 22858369
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
 
LVL 1

Expert Comment

by:SaTaX
ID: 22859190
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
 
LVL 7

Author Comment

by:fifthelement80
ID: 22860562
@SaTaX : Thank you for your reply , but your solution doesn't set proxy on dial up connections and only works for LAN connection.
0
 
LVL 7

Accepted Solution

by:
fifthelement80 earned 0 total points
ID: 22860727
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

Technology Partners: 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!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
Suggested Courses
Course of the Month4 days, 13 hours left to enroll

635 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question