From 3a58f894107f3aaaab76fda1b8ab56a0590b98a5 Mon Sep 17 00:00:00 2001 From: geby Date: Fri, 14 Jan 2022 09:24:24 +0000 Subject: [PATCH] New implementation of GetIEProxy for IE 5.0+ git-svn-id: https://svn.code.sf.net/p/synalist/code/trunk@249 7c85be65-684b-0410-a082-b2ed4fbef004 --- synamisc.pas | 91 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 28 deletions(-) diff --git a/synamisc.pas b/synamisc.pas index 22c31e0..fd468c2 100644 --- a/synamisc.pas +++ b/synamisc.pas @@ -1,9 +1,9 @@ {==============================================================================| -| Project : Ararat Synapse | 001.003.001 | +| Project : Ararat Synapse | 001.004.000 | |==============================================================================| | Content: misc. procedures and functions | |==============================================================================| -| Copyright (c)1999-2014, Lukas Gebauer | +| Copyright (c)1999-2022, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | @@ -33,7 +33,7 @@ | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| -| Portions created by Lukas Gebauer are Copyright (c) 2002-2010. | +| Portions created by Lukas Gebauer are Copyright (c) 2002-2022. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | @@ -80,9 +80,7 @@ uses synautil, blcksock, SysUtils, Classes {$IFDEF UNIX} {$IFNDEF FPC} - {$IFNDEF POSIX} , Libc - {$ENDIF} {$ENDIF} {$ELSE} , Windows @@ -98,10 +96,10 @@ Type end; {:With this function you can turn on a computer on the network, if this computer - supports Wake-on-LAN feature. You need the MAC address - (network card identifier) of the computer. You can also assign a target IP - addres. If you do not specify it, then broadcast is used to deliver magic - wake-on-LAN packet. + supports Wake-on-LAN feature. You need the MAC address + (network card identifier) of the computer. You can also assign a target IP + addres. If you do not specify it, then broadcast is used to deliver magic + wake-on-LAN packet. However broadcasts work only on your local network. When you need to wake-up a computer on another network, you must specify any existing IP addres on same network segment as targeting computer.} @@ -111,11 +109,11 @@ procedure WakeOnLan(MAC, IP: string); is defined, then the result is comma-delimited.} function GetDNS: string; -{:Autodetect InternetExplorer proxy setting for given protocol. This function +{:Read InternetExplorer 5.0+ proxy setting for given protocol. This function works only on windows!} function GetIEProxy(protocol: string): TProxySetting; -{:Return all known IP addresses on the local system. Addresses are divided by +{:Return all known IP addresses on the local system. Addresses are divided by comma/comma-delimited.} function GetLocalIPs: string; @@ -140,7 +138,7 @@ begin for n := 0 to 5 do begin b := StrToIntDef('$' + MAC[n * 2 + 1] + MAC[n * 2 + 2], 0); - HexMac := HexMac + AnsiChar(b); + HexMac := HexMac + char(b); end; if IP = '' then IP := cBroadcast; @@ -298,7 +296,6 @@ end; {$ENDIF} {==============================================================================} - function GetIEProxy(protocol: string): TProxySetting; {$IFDEF UNIX} begin @@ -308,19 +305,48 @@ begin end; {$ELSE} type - PInternetProxyInfo = ^TInternetProxyInfo; - TInternetProxyInfo = packed record - dwAccessType: DWORD; - lpszProxy: LPCSTR; - lpszProxyBypass: LPCSTR; + PInternetPerConnOption = ^INTERNET_PER_CONN_OPTION; + INTERNET_PER_CONN_OPTION = record + dwOption: DWORD; + case Integer of + 0: (dwValue: DWORD); +// 1: (pszValue:LPTSTR); + 1: (pszValue:PAnsiChar); + 2: (ftValue: FILETIME); + end; + + PInternetPerConnOptionList = ^INTERNET_PER_CONN_OPTION_LIST; + INTERNET_PER_CONN_OPTION_LIST = record + dwSize :DWORD; +// pszConnection :LPTSTR; + pszConnection :PAnsiChar; + dwOptionCount :DWORD; + dwOptionError :DWORD; + pOptions :PInternetPerConnOption; end; const - INTERNET_OPTION_PROXY = 38; - INTERNET_OPEN_TYPE_PROXY = 3; + 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 + PROXY_TYPE_AUTO_PROXY_URL = $00000004; // autoproxy URL + PROXY_TYPE_AUTO_DETECT = $00000008; // use autoproxy detection + AUTO_PROXY_FLAG_USER_SET = $00000001; // user changed this setting + AUTO_PROXY_FLAG_ALWAYS_DETECT = $00000002; // force detection even when its not needed + AUTO_PROXY_FLAG_DETECTION_RUN = $00000004; // detection has been run + AUTO_PROXY_FLAG_MIGRATED = $00000008; // migration has just been done + AUTO_PROXY_FLAG_DONT_CACHE_PROXY_RESULT = $00000010; // don't cache result of host=proxy name + AUTO_PROXY_FLAG_CACHE_INIT_RUN = $00000020; // don't initalize and run unless URL expired + AUTO_PROXY_FLAG_DETECTION_SUSPECT = $00000040; // if we're on a LAN & Modem, with only one IP, bad?!? + INTERNET_OPTION_PER_CONNECTION_OPTION = 75; WininetDLL = 'WININET.DLL'; var WininetModule: THandle; - ProxyInfo: PInternetProxyInfo; + Option : array[0..4] of INTERNET_PER_CONN_OPTION; + List : INTERNET_PER_CONN_OPTION_LIST; Err: Boolean; Len: DWORD; Proxy: string; @@ -343,15 +369,25 @@ begin if protocol = '' then protocol := 'http'; - Len := 4096; - GetMem(ProxyInfo, Len); ProxyList := TStringList.Create; try - Err := InternetQueryOption(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len); + Option[0].dwOption := INTERNET_PER_CONN_AUTOCONFIG_URL; + Option[1].dwOption := INTERNET_PER_CONN_AUTODISCOVERY_FLAGS; + Option[2].dwOption := INTERNET_PER_CONN_FLAGS; + Option[3].dwOption := INTERNET_PER_CONN_PROXY_BYPASS; + Option[4].dwOption := INTERNET_PER_CONN_PROXY_SERVER; + + List.dwSize := SizeOf(INTERNET_PER_CONN_OPTION_LIST); + List.pszConnection := nil; // LAN + List.dwOptionCount := 5; + List.dwOptionError := 0; + List.pOptions := @Option; + + + Err := InternetQueryOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @List, List.dwSize); if Err then - if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then begin - ProxyList.CommaText := ReplaceString(ProxyInfo^.lpszProxy, ' ', ','); + ProxyList.CommaText := ReplaceString(Option[4].pszValue, ' ', ','); Proxy := ''; DefProxy := ''; for n := 0 to ProxyList.Count -1 do @@ -371,11 +407,10 @@ begin Result.Host := Trim(SeparateLeft(Proxy, ':')); Result.Port := Trim(SeparateRight(Proxy, ':')); end; - Result.Bypass := ReplaceString(ProxyInfo^.lpszProxyBypass, ' ', ','); + Result.Bypass := ReplaceString(Option[3].pszValue, ' ', ','); end; finally ProxyList.Free; - FreeMem(ProxyInfo); end; finally FreeLibrary(WininetModule);