встретил только 2 реализации смены текущей прокси для ослика. 1. через реестр 2. через InternetSetOption + INTERNET_OPTION_PROXY но Цитата(MSDN) | Note It is recommended that INTERNET_OPTION_PER_CONNECTION_OPTION be used instead of INTERNET_OPTION_PROXY. For more information, see KB article 226473. |
там же приведены примеры. но на делфи я реализации не нашел. вот код, адаптированный под делфи: Код | const INTERNET_OPTION_PER_CONNECTION_OPTION = 75; // // Options used in INTERNET_PER_CONN_OPTON struct // 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; INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL = 6; INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS = 7; INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME = 8; INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL = 9;
// // PER_CONN_FLAGS // 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
type PINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION; INTERNET_PER_CONN_OPTION = record dwOption : DWORD; // option to be queried or set case Byte of 0: (dwValue: DWORD); // dword value for the option 1: (pszValue: LPSTR); // pointer to string value for the option 2: (ftValue: FILETIME); // file-time value for the option end;
INTERNET_PER_CONN_OPTION_LIST = record dwSize: DWORD; // size of the INTERNET_PER_CONN_OPTION_LIST struct pszConnection: LPSTR; // connection name to set/query options dwOptionCount: DWORD; // number of options to set/query dwOptionError: DWORD; // on error, which option failed pOptions: PINTERNET_PER_CONN_OPTION; // array of options to set/query end;
function SetProxyGlobal( const AProxyHost: string; AProxyPort: Word ): Boolean; var lList: INTERNET_PER_CONN_OPTION_LIST; lOption: array[0..1] of INTERNET_PER_CONN_OPTION; lProxy: string; lResetProxy: Boolean; begin lResetProxy := (AProxyHost = '') or (AProxyPort = 0); lProxy := AProxyHost + ':' + IntToStr( AProxyPort ); lOption[0].dwOption := INTERNET_PER_CONN_FLAGS; if lResetProxy then lOption[0].dwValue := PROXY_TYPE_DIRECT else lOption[0].dwValue := PROXY_TYPE_PROXY; lOption[1].dwOption := INTERNET_PER_CONN_PROXY_SERVER; lOption[1].pszValue := PChar( lProxy ); lList.dwSize := SizeOf(INTERNET_PER_CONN_OPTION_LIST); lList.pszConnection := nil; if lResetProxy then lList.dwOptionCount := 1 else lList.dwOptionCount := 2; lList.dwOptionError := 0; lList.pOptions := @lOption[0]; Result := InternetSetOption( nil, INTERNET_OPTION_PER_CONNECTION_OPTION, @lList, SizeOf(INTERNET_PER_CONN_OPTION_LIST) ); if Result then InternetSetOption(nil, INTERNET_OPTION_REFRESH, nil, 0); end;
|
примеры использования: установить: Код | if not SetProxyGlobal( 'localhost', 8888 ) then RaiseLastOSError;
|
установить прямое соединение: Код | if not SetProxyGlobal( '', 0 ) then RaiseLastOSError;
|
--------------------
There are always someone smarter than you...
|