Конференция "Сети" » Получить найстройки прокси изпользуя WinHttpGetProxyForUrl [D7, WinXP]
 
  • NeonSimfi © (11.08.09 19:36) [0]
    Пожалуйста, помогите получить настройки прокси-сервера используя функция WinHttpGetProxyForUrl  из WinHttp.dll. "Вариант решения" используя реестр(или через модуль WinInet) не подходит.
  • Дмитрий Белькевич (12.08.09 15:28) [1]

    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;

    {**************************************************************************
    * NAME:    GetProxyServer
    * DESC:    Proxy-Server Einstellungen abfragen
    * PARAMS:  protocol => z.B. 'http' oder 'ftp'
    * RESULT:  [-]
    * CREATED: 08-04-2004/shmia
    *************************************************************************}


    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;

  • Дмитрий Белькевич (12.08.09 15:29) [2]

    > (или через модуль WinInet)


    Эээээ... Сорри, не увидел... Это через WinInet.
  • Дмитрий Белькевич (12.08.09 15:43) [3]
  • NeonSimfi © (13.08.09 11:59) [4]
    Спасибо большое за ссылочку (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;



    Подскажите, пожалуйста, где ошибка...
 
Конференция "Сети" » Получить найстройки прокси изпользуя WinHttpGetProxyForUrl [D7, WinXP]
Есть новые Нет новых   [134437   +29][b:0][p:0.003]