-
Пожалуйста, помогите получить настройки прокси-сервера используя функция WinHttpGetProxyForUrl из WinHttp.dll. "Вариант решения" используя реестр(или через модуль WinInet) не подходит.
-
function GetProxyInformation: string;
var
ProxyInfo: PInternetProxyInfo;
Len: LongWord;
begin
Result := '';
Len := 4096;
GetMem(ProxyInfo, Len);
try
if InternetQueryOption(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then
if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then
begin
Result := ProxyInfo^.lpszProxy
end;
finally
FreeMem(ProxyInfo);
end;
end;
procedure GetProxyServer(protocol: string; var ProxyServer: string; var ProxyPort: Integer);
var
i: Integer;
proxyinfo: string;
begin
ProxyServer := '';
ProxyPort := 0;
proxyinfo := GetProxyInformation;
if proxyinfo = '' then
Exit;
protocol := protocol + '=';
i := Pos(protocol, proxyinfo);
if i > 0 then
begin
Delete(proxyinfo, 1, i + Length(protocol));
i := Pos(';', ProxyServer);
if i > 0 then
proxyinfo := Copy(proxyinfo, 1, i - 1);
end;
i := Pos(':', proxyinfo);
if i > 0 then
begin
ProxyPort := StrToIntDef(Copy(proxyinfo, i + 1, Length(proxyinfo) - i), 0);
ProxyServer := Copy(proxyinfo, 1, i - 1)
end
end;
-
> (или через модуль WinInet)
Эээээ... Сорри, не увидел... Это через WinInet.
-
-
Спасибо большое за ссылочку ( http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-interop/4397/Problem-using-a-WinHttpGetProxyForUrl-function-Struct-use), но что у меня не выходит WinHttpGetProxyForUrl все время возвращает False (GetLastError всегда 0). Вот код:
type
LPVOID = Pointer;
pWinHttpAutoProxyOptions = ^WINHTTP_AUTOPROXY_OPTIONS;
WINHTTP_AUTOPROXY_OPTIONS = record
dwFlags: DWORD;
dwAutoDetectFlags: DWORD;
lpszAutoConfigUrl: LPCWSTR;
lpvReserved: LPVOID;
dwReserved: DWORD;
fAutoLogonIfChallenged: BOOL;
end;
TWinHttpOpen = function(pwszUserAgent: LPCWSTR; dwAccessType: DWORD; pwszProxyName: LPCWSTR; pwszProxyBypass: LPCWSTR; dwFlags: DWORD): HINTERNET; stdcall;
TWinHttpCloseHandle = function(hInternet: HINTERNET): BOOL; stdcall;
TWinHttpGetProxyForUrl = function(hSession: HINTERNET; lpcwszUrl: LPCWSTR; pAutoProxyOptions: pWinHttpAutoProxyOptions; out pProxyInfo: PInternetProxyInfo): BOOL; stdcall;
const
WINHTTP_ACCESS_TYPE_NO_PROXY = 1;
WINHTTP_AUTOPROXY_AUTO_DETECT = $00000001;
WINHTTP_AUTOPROXY_CONFIG_URL = $00000002;
WINHTTP_AUTO_DETECT_TYPE_DHCP = $00000001;
WINHTTP_AUTO_DETECT_TYPE_DNS_A = $00000002;
TEST_PAGE_URL = 'http://www.google.com/';
userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1; SV1)';
var
WinHttpDLL: THandle;
WinHttpGetProxyForUrl: TWinHttpGetProxyForUrl;
WinHttpOpen: TWinHttpOpen;
WinHttpCloseHandle: TWinHttpCloseHandle;
hSession: HINTERNET;
ProxyInfo: PInternetProxyInfo;
pAutoProxyOptions: pWinHttpAutoProxyOptions;
begin
WinHttpDLL := LoadLibrary(PChar('WinHttp.dll'));
try
@WinHttpOpen := GetProcAddress(WinHttpDLL, 'WinHttpOpen');
@WinHttpCloseHandle := GetProcAddress(WinHttpDLL, 'WinHttpCloseHandle');
@WinHttpGetProxyForUrl := GetProcAddress(WinHttpDLL, WinHttpGetProxyForUrl');
hSession := WinHttpOpen(userAgent, WINHTTP_ACCESS_TYPE_NO_PROXY, nil, nil, 0);
New(ProxyInfo);
New(pAutoProxyOptions);
pAutoProxyOptions^.dwFlags := WINHTTP_AUTOPROXY_CONFIG_URL;
pAutoProxyOptions^.dwAutoDetectFlags := 0;
pAutoProxyOptions^.lpszAutoConfigUrl := TEST_PAGE_URL;
pAutoProxyOptions^.lpvReserved := nil;
pAutoProxyOptions^.dwReserved := 0;
pAutoProxyOptions^.fAutoLogonIfChallenged := True;
if WinHttpGetProxyForUrl(hSession,
TEST_PAGE_URL,
pAutoProxyOptions,
ProxyInfo)
then ShowMessage('TRUE')
else ShowMessage('FALSE');
ShowMessage(IntToStr(GetLastError));
WinHttpCloseHandle(hSession);
Dispose(pAutoProxyOptions);
Dispose(ProxyInfo);
finally
FreeLibrary(WinHttpDLL);
end;
Подскажите, пожалуйста, где ошибка...
|