-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSystemProxy.pas
More file actions
107 lines (87 loc) · 2.56 KB
/
Copy pathSystemProxy.pas
File metadata and controls
107 lines (87 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit SystemProxy;
interface
function EnableSystemProxy(const host: string; port: word): boolean;
function DisableSystemProxy: boolean;
implementation
uses
Windows, SysUtils, WinInet;
type
INTERNET_PER_CONN_OPTION = record
dwOption: DWORD;
Value: record
case Integer of
1:
(dwValue: DWORD);
2:
(pszValue: LPTSTR);
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 SetOptions(const proxyStr: string): boolean;
var
list: INTERNET_PER_CONN_OPTION_LIST;
opts: array [0 .. 2] of INTERNET_PER_CONN_OPTION;
begin
ZeroMemory(@list, SizeOf(list));
ZeroMemory(@opts, SizeOf(opts));
list.dwSize := SizeOf(list);
list.pszConnection := nil;
list.pOptions := @opts[0];
if proxyStr = '' then
begin
list.dwOptionCount := 1;
opts[0].dwOption := INTERNET_PER_CONN_FLAGS;
opts[0].Value.dwValue := PROXY_TYPE_DIRECT;
end
else
begin
list.dwOptionCount := 3;
opts[0].dwOption := INTERNET_PER_CONN_FLAGS;
opts[0].Value.dwValue := PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
opts[1].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
opts[1].Value.pszValue := PChar(proxyStr);
opts[2].dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
opts[2].Value.pszValue := '<local>';
end;
result := InternetSetOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @list, SizeOf(list));
if result then
begin
InternetSetOption(nil, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0);
InternetSetOption(nil, INTERNET_OPTION_REFRESH, nil, 0);
end;
end;
function EnableSystemProxy(const host: string; port: word): boolean;
var
valueStr, proxyStr: string;
begin
valueStr := Format('%s:%d', [host, port]);
proxyStr := Format('http=%s;https=%s;socks=%s', [valueStr, valueStr, valueStr]);
result := SetOptions(proxyStr);
end;
function DisableSystemProxy: boolean;
begin
result := SetOptions('');
end;
end.