2017-04-19 19 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; 

但我也想使用代理與身份驗證。在這裏我遇到了麻煩。我才知道這是可能的使用WinAPI的功能InternetSetOption,下面的例子來設置代理服務器名和密碼:

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

我得知InternetSetOption與像INTERNET_OPTION_PROXY_USERNAME參數可以僅適用於由類似功能所產生的互聯網手柄InternetConnect或HttpOpenRequest。

關於此問題的答案可以在here找到。

這不是問題,我可以先撥打InternetConnect。但似乎是不可能的後綁定這個互聯網句柄我的TWebBrowser。 TWebBrowser會忽略這些設置,因爲它們適用於具體的專用互聯網句柄。

所以我的問題:是否有可能在Delphi代碼中使用身份驗證設置代理以從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

雷米Lebeau,是的,完全。其實我忘了在代碼中添加這個代碼片段:New(PIInfo); ..... Dispose(PInfo); –

回答

0

David Heffernan的評論迫使我進入正確的方向。回答我自己的問題,如果有人會尋找答案,我發現了這個問題的三個解決方案。

所有的代碼片段可用於Delphi XE4

1.在TWebBrowser中使用事件處理程序。

TWebBrowser有事件OnBeforeNavigate2。此方法的過程包含字段Headers。因此,我們可以這樣定義的一些方法:

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; 

...之後它適用於web瀏覽器...

WebBrowser1.OnBeforeNavigate2 := WebBrowser1BeforeNavigate2; 

該方法是基於使用的標題Proxy-Authorization,允許定義代理憑據請求。它還需要首先使用第一篇文章中定義的UrlMkSetSessionOption來設置代理服務器和端口。

2.使用報頭的方法中Navigate2

TWebBrowser的方法Navigate2參數支持參數Headers。所以我們可以在調用這個方法時定義相同的頭文件Proxy-Authorization。這種方式的問題是Navigate2的所有內部調用(就像頁面上的某個Javascript會通過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不一定是爲了您的目的,您可以看看這個組件。