TIdHTTP'yi IE proxy yapılandırmasını kullanacak şekilde nasıl ayarlayabilirim?
XP/Vista/Win7 ile uyumlu ve güvenilir olmalıdır.IE Proxy ayarlarını belirleme ve TIdHTTP
cevap
Indy, Internet Explorer'ın proxy ayarlarını kullanmaz ve bu nedenle, örneğin InternetQueryOption
işlevini kullanarak kendiniz almanız gerekir.
Güncelleme: İşte
IE ayarları almaya çalışmalısınız WinHTTP
kullanarak kodudur. Kullanılabilirlerse ve otomatik algılayıcı proxy ayarlarını veya otomatik yapılandırma komut dosyası URL'si seçenekleri ayarlanmışsa, proxy algılama gerçekleştirilir. Otomatik ayarları, IE ayarları mevcut olmadığında da gerçekleştirilecektir.
Yasal Uyarı: Aşağıdaki kod en kolay durum için sadece test edilmiştir
IE ayarlar kullanılabilir ve proxy ayarları otomatik olarak tespit edilecek yapılandırılmamış zaman (yok ortam). Ayrıca, bu ünitede bazı işlevlerin, yapıların ve sabitlerin ek olduğunu unutmayın.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
HINTERNET = Pointer;
{$EXTERNALSYM HINTERNET}
INTERNET_PORT = Word;
{$EXTERNALSYM INTERNET_PORT}
PWinHTTPProxyInfo = ^TWinHTTPProxyInfo;
WINHTTP_PROXY_INFO = record
dwAccessType: DWORD;
lpszProxy: LPWSTR;
lpszProxyBypass: LPWSTR;
end;
{$EXTERNALSYM WINHTTP_PROXY_INFO}
TWinHTTPProxyInfo = WINHTTP_PROXY_INFO;
LPWINHTTP_PROXY_INFO = PWinHTTPProxyInfo;
{$EXTERNALSYM LPWINHTTP_PROXY_INFO}
PWinHTTPAutoProxyOptions = ^TWinHTTPAutoProxyOptions;
WINHTTP_AUTOPROXY_OPTIONS = record
dwFlags: DWORD;
dwAutoDetectFlags: DWORD;
lpszAutoConfigUrl: LPCWSTR;
lpvReserved: Pointer;
dwReserved: DWORD;
fAutoLogonIfChallenged: BOOL;
end;
{$EXTERNALSYM WINHTTP_AUTOPROXY_OPTIONS}
TWinHTTPAutoProxyOptions = WINHTTP_AUTOPROXY_OPTIONS;
LPWINHTTP_AUTOPROXY_OPTIONS = PWinHTTPAutoProxyOptions;
{$EXTERNALSYM LPWINHTTP_AUTOPROXY_OPTIONS}
PWinHTTPCurrentUserIEProxyConfig = ^TWinHTTPCurrentUserIEProxyConfig;
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG = record
fAutoDetect: BOOL;
lpszAutoConfigUrl: LPWSTR;
lpszProxy: LPWSTR;
lpszProxyBypass: LPWSTR;
end;
{$EXTERNALSYM WINHTTP_CURRENT_USER_IE_PROXY_CONFIG}
TWinHTTPCurrentUserIEProxyConfig = WINHTTP_CURRENT_USER_IE_PROXY_CONFIG;
LPWINHTTP_CURRENT_USER_IE_PROXY_CONFIG = PWinHTTPCurrentUserIEProxyConfig;
{$EXTERNALSYM LPWINHTTP_CURRENT_USER_IE_PROXY_CONFIG}
function WinHttpOpen(pwszUserAgent: LPCWSTR; dwAccessType: DWORD;
pwszProxyName, pwszProxyBypass: LPCWSTR; dwFlags: DWORD): HINTERNET; stdcall;
external 'winhttp.dll' name 'WinHttpOpen';
{$EXTERNALSYM WinHttpOpen}
function WinHttpConnect(hSession: HINTERNET; pswzServerName: LPCWSTR;
nServerPort: INTERNET_PORT; dwReserved: DWORD): HINTERNET; stdcall;
external 'winhttp.dll' name 'WinHttpConnect';
{$EXTERNALSYM WinHttpConnect}
function WinHttpOpenRequest(hConnect: HINTERNET; pwszVerb: LPCWSTR;
pwszObjectName: LPCWSTR; pwszVersion: LPCWSTR; pwszReferer: LPCWSTR;
ppwszAcceptTypes: PLPWSTR; dwFlags: DWORD): HINTERNET; stdcall;
external 'winhttp.dll' name 'WinHttpOpenRequest';
{$EXTERNALSYM WinHttpOpenRequest}
function WinHttpQueryOption(hInet: HINTERNET; dwOption: DWORD;
lpBuffer: Pointer; var lpdwBufferLength: DWORD): BOOL; stdcall;
external 'winhttp.dll' name 'WinHttpQueryOption';
{$EXTERNALSYM WinHttpQueryOption}
function WinHttpGetProxyForUrl(hSession: HINTERNET; lpcwszUrl: LPCWSTR;
pAutoProxyOptions: LPWINHTTP_AUTOPROXY_OPTIONS;
var pProxyInfo: WINHTTP_PROXY_INFO): BOOL; stdcall;
external 'winhttp.dll' name 'WinHttpGetProxyForUrl';
{$EXTERNALSYM WinHttpGetProxyForUrl}
function WinHttpGetIEProxyConfigForCurrentUser(
var pProxyInfo: WINHTTP_CURRENT_USER_IE_PROXY_CONFIG): BOOL; stdcall;
external 'winhttp.dll' name 'WinHttpGetIEProxyConfigForCurrentUser';
{$EXTERNALSYM WinHttpGetIEProxyConfigForCurrentUser}
function WinHttpCloseHandle(hInternet: HINTERNET): BOOL; stdcall;
external 'winhttp.dll' name 'WinHttpCloseHandle';
{$EXTERNALSYM WinHttpCloseHandle}
const
WINHTTP_NO_REFERER = nil;
{$EXTERNALSYM WINHTTP_NO_REFERER}
WINHTTP_NO_PROXY_NAME = nil;
{$EXTERNALSYM WINHTTP_NO_PROXY_NAME}
WINHTTP_NO_PROXY_BYPASS = nil;
{$EXTERNALSYM WINHTTP_NO_PROXY_BYPASS}
WINHTTP_DEFAULT_ACCEPT_TYPES = nil;
{$EXTERNALSYM WINHTTP_DEFAULT_ACCEPT_TYPES}
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
{$EXTERNALSYM WINHTTP_ACCESS_TYPE_DEFAULT_PROXY}
WINHTTP_ACCESS_TYPE_NO_PROXY = 1;
{$EXTERNALSYM WINHTTP_ACCESS_TYPE_NO_PROXY}
WINHTTP_OPTION_PROXY = 38;
{$EXTERNALSYM WINHTTP_OPTION_PROXY}
WINHTTP_OPTION_PROXY_USERNAME = $1002;
{$EXTERNALSYM WINHTTP_OPTION_PROXY_USERNAME}
WINHTTP_OPTION_PROXY_PASSWORD = $1003;
{$EXTERNALSYM WINHTTP_OPTION_PROXY_PASSWORD}
WINHTTP_AUTOPROXY_AUTO_DETECT = $00000001;
{$EXTERNALSYM WINHTTP_AUTOPROXY_AUTO_DETECT}
WINHTTP_AUTOPROXY_CONFIG_URL = $00000002;
{$EXTERNALSYM WINHTTP_AUTOPROXY_CONFIG_URL}
WINHTTP_AUTO_DETECT_TYPE_DHCP = $00000001;
{$EXTERNALSYM WINHTTP_AUTO_DETECT_TYPE_DHCP}
WINHTTP_AUTO_DETECT_TYPE_DNS_A = $00000002;
{$EXTERNALSYM WINHTTP_AUTO_DETECT_TYPE_DNS_A}
WINHTTP_FLAG_BYPASS_PROXY_CACHE = $00000100;
{$EXTERNALSYM WINHTTP_FLAG_BYPASS_PROXY_CACHE}
WINHTTP_FLAG_REFRESH = WINHTTP_FLAG_BYPASS_PROXY_CACHE;
{$EXTERNALSYM WINHTTP_FLAG_REFRESH}
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TProxyInfo = record
ProxyURL: WideString;
ProxyBypass: WideString;
ProxyAutoDetected: Boolean;
end;
function GetProxyInfo(const AURL: WideString; var AProxyInfo: TProxyInfo): DWORD;
var
Session: HINTERNET;
AutoDetectProxy: Boolean;
WinHttpProxyInfo: TWinHTTPProxyInfo;
AutoProxyOptions: TWinHTTPAutoProxyOptions;
IEProxyConfig: TWinHTTPCurrentUserIEProxyConfig;
begin
// initialize the result
Result := 0;
// initialize auto-detection to off
AutoDetectProxy := False;
// initialize the result structure
AProxyInfo.ProxyURL := '';
AProxyInfo.ProxyBypass := '';
AProxyInfo.ProxyAutoDetected := False;
// initialize the auto-proxy options
FillChar(AutoProxyOptions, SizeOf(AutoProxyOptions), 0);
// check if the Internet Explorer's proxy configuration is
// available and if so, check its settings for auto-detect
// proxy settings and auto-config script URL options
if WinHttpGetIEProxyConfigForCurrentUser(IEProxyConfig) then
begin
// if the Internet Explorer is configured to auto-detect
// proxy settings then we try to detect them later on
if IEProxyConfig.fAutoDetect then
begin
AutoProxyOptions.dwFlags := WINHTTP_AUTOPROXY_AUTO_DETECT;
AutoProxyOptions.dwAutoDetectFlags := WINHTTP_AUTO_DETECT_TYPE_DHCP or
WINHTTP_AUTO_DETECT_TYPE_DNS_A;
AutoDetectProxy := True;
end;
// if the Internet Explorer is configured to use the proxy
// auto-config script then we try to use it
if IEProxyConfig.lpszAutoConfigURL <> '' then
begin
AutoProxyOptions.dwFlags := AutoProxyOptions.dwFlags or
WINHTTP_AUTOPROXY_CONFIG_URL;
AutoProxyOptions.lpszAutoConfigUrl := IEProxyConfig.lpszAutoConfigUrl;
AutoDetectProxy := True;
end;
// if IE don't have auto-detect or auto-config set, we are
// done here and we can fill the AProxyInfo with the IE settings
if not AutoDetectProxy then
begin
AProxyInfo.ProxyURL := IEProxyConfig.lpszProxy;
AProxyInfo.ProxyBypass := IEProxyConfig.lpszProxyBypass;
AProxyInfo.ProxyAutoDetected := False;
end;
end
else
begin
// if the Internet Explorer's proxy configuration is not
// available, then try to auto-detect it
AutoProxyOptions.dwFlags := WINHTTP_AUTOPROXY_AUTO_DETECT;
AutoProxyOptions.dwAutoDetectFlags := WINHTTP_AUTO_DETECT_TYPE_DHCP or
WINHTTP_AUTO_DETECT_TYPE_DNS_A;
AutoDetectProxy := True;
end;
// if the IE proxy settings are not available or IE has
// configured auto-config script or auto-detect proxy settings
if AutoDetectProxy then
begin
// create a temporary WinHttp session to allow the WinHTTP
// auto-detect proxy settings if possible
Session := WinHttpOpen(nil, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
// if the WinHttp session has been created then try to
// get the proxy data for the specified URL else we assign
// the last error code to the function result
if Assigned(Session) then
try
// get the proxy data for the specified URL with the
// auto-proxy options specified, if succeed then we can
// fill the AProxyInfo with the retrieved settings else
// we assign the last error code to the function result
if WinHttpGetProxyForUrl(Session, LPCWSTR(AURL),
@AutoProxyOptions, WinHttpProxyInfo) then
begin
AProxyInfo.ProxyURL := WinHttpProxyInfo.lpszProxy;
AProxyInfo.ProxyBypass := WinHttpProxyInfo.lpszProxyBypass;
AProxyInfo.ProxyAutoDetected := True;
end
else
Result := GetLastError;
finally
WinHttpCloseHandle(Session);
end
else
Result := GetLastError;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Result: DWORD;
ProxyInfo: TProxyInfo;
begin
Result := GetProxyInfo('http://www.example.com', ProxyInfo);
case Result of
0:
ShowMessage(
'Proxy URL: ' + ProxyInfo.ProxyURL + sLineBreak +
'Proxy bypass: ' + ProxyInfo.ProxyBypass + sLineBreak +
'Proxy autodetected: ' + BoolToStr(ProxyInfo.ProxyAutoDetected, True));
12166: ShowMessage('Error in proxy auto-config script code');
12167: ShowMessage('Unable to download proxy auto-config script');
12180: ShowMessage('WPAD detection failed');
else
ShowMessage('Last error: ' + IntToStr(Result));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
end;
end.
Alternatif bir Delphi kodu için, örn. this tip
.
uses
IdGlobal;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
Result: DWORD;
ProxyInfo: TProxyInfo;
begin
Result := GetProxyInfo('http://www.example.com', ProxyInfo);
if Result <> 0 then
IdHTTP1.ProxyParams.Clear
else
begin
S := ProxyInfo.ProxyURL;
IdHTTP1.ProxyParams.ProxyServer := Fetch(S, ':');
IdHTTP1.ProxyParams.ProxyPort := StrToInt(S);
end;
end;
Sen aracılığıyla da alabilirsiniz: Burada
kurulum için elde proxy ayarlarıyla birTIdHTTP
(aslında sadece elde vekil URL'yi ayrıştıracak ve
ProxyServer
ve
ProxyPort
özelliklerine geçmek) nasıl bir örnek olarak Windows Kayıt:
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings',false);
Caption :=Reg.ReadString('ProxyServer');
Reg.Free;
end;
- 1. geçerli proxy ayarlarını belirleme
- 2. TIdHttp
- 3. Tarayıcı proxy ayarlarını Python'dan değiştirebilir misiniz?
- 4. NGINX proxy ayarlarını çeşitli konumlarda yeniden kullanma
- 5. IE Yerel İntranet Ayarlarını Geçersiz Kılma
- 6. Ağ proxy ayarlarını Mac OS X Lion
- 7. Indy TIdHTTP
- 8. WebRequest'ten proxy nasıl kaldırılır ve DefaultWebProxy'ye dokunulmaz
- 9. Proxy ayarlarını nasıl yapılandırabilirim böylece eclipse indigo yeni eklentiler yükleyebilir
- 10. HttpWebRequest için Proxy Proxy
- 11. Kaldır proxy ayarları komutunu bir vekil ağında iken şöyle ben cmd proxy ayarlarını etmişti
- 12. Tarayıcı sekmesinin etkin olup olmadığını belirleme - IE mi?
- 13. IFRAME: IE gelin ve Kenar IE yılında
- 14. TIdHttp isteğine özel üstbilgi ekleme, üstbilgi değeri
- 15. PHP komut dosyalarının izin ayarlarını nasıl belirlerim?
- 16. CSS, Chrome ve IE
- 17. IE ve firefox
- 18. scrapy ayarlarını
- 19. proxy
- 20. Proxy
- 21. IE
- 22. IE
- 23. IE
- 24. Windows ve Mono'da C# Hizmet Ayarlarını Kaydetme
- 25. Tekli Tutulma Perspektifini ve Ayarlarını Dışarı Aktar
- 26. IE
- 27. IE
- 28. IE
- 29. Geliştirici Web Proxy
- 30. ELB, Proxy Protokolü ve iptables
+1 bazı örnek delphi kod için bir bağlantı eklendi ... – Yahia
"eski" delphi kodu ile neyi kastediyorsunuz? Aynı zamanda [Web Proxy Otomatik Bulma Protokolü] 'ni de destekleyecek mi (http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol)? – ZigiZ
@ zigi70, Yahia tarafından eklenen bağlantıya sahip olan not, büyük olasılıkla kod örneğinin 7 yaşında olduğu anlamına gelir. WPAD'nin _F destekleneceği sorusu için, evet öyle olacak, ama örneğin [http://stackoverflow.com/a/5138232/960757] gibi sorunlarla karşılaşabilirsiniz. 'InternetQueryOption' işlevi, Internet Explorer tarafından en yakın zamanda algılanan proxy yapılandırma komut dosyasını bulmak için kullanılır, bu yüzden 'WPAD' etkinleştirilmiş ve bağlanmış olsaydınız, muhtemelen daha önce otomatik olarak algılanan en yeni ayarları alırsınız. – TLama