2017-04-19 43 views
2

Delphi VCL 컴포넌트 TWebBrowser를 프록시와 함께 사용하고 싶습니다. 이 일을 아주 쉽게하는 것 같습니다 :Delphi TWebBrowser - 로그인/암호와 함께 프록시를 사용하는 방법?

var PIInfo: PInternetProxyInfo; 
begin 
    PIInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY; 
    PIInfo^.lpszProxy := PAnsiChar('proxyserver.com:8888'); 
    PIInfo^.lpszProxyBypass := PAnsiChar(''); 
    UrlMkSetSessionOption(INTERNET_OPTION_PROXY, PIInfo, SizeOf(Internet_Proxy_Info), 0); 
end; 

그러나 나는 또한 인증과 함께 프록시를 사용하고 싶습니다. 그리고 여기 나는 문제가있다. INTERNET_OPTION_PROXY_USERNAME 같은 매개 변수는 같은 기능에 의해 제작되었다 인터넷 핸들에 적용 할 수와 난 후에 InternetSetOption 것을 알게

var UserName: AnsiString; 
    ConnectionHandle: HINTERNET; 
begin 
    // Init ConnectionHandle here 
    //... 
    res := InternetSetOption(ConnectionHandle, 
          INTERNET_OPTION_PROXY_USERNAME, 
          UserName, 
          Length(UserName) + 1); 
end; 

: 나는 WinAPI를 함수로 InternetSetOption, 아래의 예를 사용하여 프록시 이름과 암호를 설정하는 것이 가능하다는 것을 배웠다 인터넷 연결 또는 HttpOpenRequest.

이에 대한 대답은 here입니다.

문제가되지 않습니다. 먼저 InternetConnect를 호출 할 수 있습니다. 하지만이 인터넷 핸들을 내 TWebBrowser에 연결 한 후에는 불가능한 것 같습니다. TWebBrowser는 콘크리트 전용 인터넷 핸들에 적용했기 때문에이 설정을 무시합니다.

그럼 내 질문 : 델파이 코드에서 인증을 사용하여 프록시를 설정하여 TWebBrowser에서 사용할 수 있습니까?

ps. 다른 옵션은 TWebBrowser가 로그인을 요구할 때 로그인/암호 프록시 설정을 기억하는 것입니다.하지만 로그인/암호를 여러 번 곱하여 코드에서 설정하고 싶습니다.

미리 감사드립니다.

+1

http://microsoft.public.inetsdk.programming.webbrowser-ctl.narkive.com/rgz718KC/how-to-pass-proxy-username-password-into-webbrowser-control –

+1

참고로, 첫 번째 코드 스 니펫은 잘못된. 아무것도 가리 키지 않은 초기화되지 않은 포인터를 선언하고 있습니다. 대신 이것을 사용해야합니다 :'var IInfo : InternetProxyInfo; IInfo.dwAccessType 시작 : = INTERNET_OPEN_TYPE_PROXY; ... UrlMkSetSessionOption (INTERNET_OPTION_PROXY, @IInfo, SizeOf (IInfo), 0); 끝, ' –

+0

레미 르 보우, 맞아. 사실이 스 니펫에 코드를 추가하는 것을 잊어 버렸습니다 : New (PIInfo); ..... 배출 (PInfo); –

답변

0

David Heffernan의 의견은 올바른 방향으로 나아갈 것을 강요했습니다. 내 자신의 질문에 응답, 누군가가 응답을 찾고 있다면, 나는이 문제의 세 가지 해결책을 발견했다.

모든 코드 스 니펫은 Delphi XE4에서 사용할 수 있습니다.

1. TWebBrowser에서 이벤트 처리기 사용.

TWebBrowser의 이벤트는 OnBeforeNavigate2입니다. 이 방법의 절차는 Headers 필드를 포함합니다. ...이 방법은 프록시 자격 증명을 정의 할 수 있습니다 헤더 Proxy-Authorization를 사용하여 기반으로

WebBrowser1.OnBeforeNavigate2 := WebBrowser1BeforeNavigate2; 

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; 
              const pDisp: IDispatch; 
              const URL: OleVariant; 
              const Flags: OleVariant; 
              const TargetFrameName: OleVariant; 
              const PostData: OleVariant; 
              const Headers: OleVariant; 
              var Cancel: WordBool); 
var aHeaders: OleVariant; 
begin 
    if ASender = WebBrowser1 then begin 
    if ALPos('X-StopHandling', Headers) <= 0 then begin 
     aHeaders := Headers + 'Proxy-Authorization: BASIC BASE64_of_login_and_password' + #13#10 + 
          'X-StopHandling: 1' + #13#10; 
     WebBrowser1.Navigate2(URL, Flags, TargetFrameName, PostData, aHeaders); 
     Cancel := true; 
    end; 
    end; 
end; 

... 그리고 후에 웹 브라우저에 적용 : 그래서 우리는 같은 몇 가지 방법을 정의 할 수 있습니다 요청. 또한 첫 번째 게시물에 정의 된대로 UrlMkSetSessionOption을 사용하여 프록시 서버와 포트를 먼저 설정해야합니다. 방법 TWebBrowser의 Navigate2에

방법에 Navigate2에

2. 사용 헤더 파라미터는 파라미터 Headers을 지원한다. 따라서이 메소드를 호출 할 때 동일한 헤더 Proxy-Authorization을 정의 할 수 있습니다. 이 방법의 문제는 Navigate2의 모든 내부 호출 (페이지의 일부 자바 스크립트가 AJAX를 통해 무언가를 호출하는 것처럼)이 헤더없이 이동한다는 것입니다.

첫 번째 솔루션에는 이러한 단점이 없습니다.

코드 조각

은 여기에 있습니다 : (활성 개발 중) 내가 델파이에 대한 크롬의 구현을 발견

다른 구성 요소를 사용하여

var EmptyParam: OleVariant; 
    //... 
begin 

    // init proxy server and port first as described in the first post 
    EmptyParam := System.Variants.EmptyParam; 
    WebBrowser1.Navigate2('http://something', 
         EmptyParam{Flags}, 
         EmptyParam{TargetFrameName}, 
         EmptyParam{PostData}, 
         'Proxy-Authorization: ...' + #13#10); 
end; 

3 - CEF4Delphi. 그것은 조금 남아있는 것으로 보이는 DCEF3 라이브러리를 기반으로했습니다.

프록시 설정 인터페이스를 기본적으로 지원합니다. 기본 브라우저 개체의 기본 속성을 사용하여 프록시 서버, 포트, 사용자 이름 및 암호를 정의 할 수 있습니다.

TWebBrowser를 반드시 사용해야하는 것이 아니라면이 구성 요소를 살펴보십시오.