Delphi TWebBrowser-如何使用带有登录名/密码的代理?

Delphi TWebBrowser-如何使用带有登录名/密码的代理?,delphi,proxy,twebbrowser,Delphi,Proxy,Twebbrowser,我想使用Delphi VCL组件TWebBrowser和代理。这样做似乎很容易: var PIInfo: PInternetProxyInfo; begin PIInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY; PIInfo^.lpszProxy := PAnsiChar('proxyserver.com:8888'); PIInfo^.lpszProxyBypass := PAnsiChar(''); UrlMkSetSession

我想使用Delphi VCL组件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和InternetOption、PROXY用户名等参数只能应用于InternetConnect或HttpOpenRequest等函数生成的INTERNET句柄

关于这一点,可以找到答案

没问题,我可以先打电话给InternetConnect。但似乎不可能在我的TWebBrowser上绑定这个互联网句柄。TWebBrowser将忽略这些设置,因为它们应用于具体的专用internet句柄

所以我的问题是:是否可以在Delphi代码中设置具有身份验证的代理以从TWebBrowser使用它

PS。另一种选择是,当TWebBrowser请求登录/密码代理设置时,记住它们,但我有多个登录/密码,所以我想从代码中设置它们

提前谢谢。

的一条评论迫使我朝着正确的方向前进。在回答我自己的问题时,如果有人在寻找答案,我找到了解决这个问题的三种方法

所有代码片段都可用于Delphi XE4

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

TWebBrowser在BeforeNavigate2上具有事件
。此方法的过程包含字段
标题
。因此,我们可以定义一些方法,如:

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
设置代理服务器和端口

2。在方法Navigate2中使用headers参数

TWebBrowser的方法Navigate2支持参数
Headers
。因此,我们可以在调用此方法时定义相同的头
代理授权
。这种方式的问题是,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。使用替代组件

我发现Chromium for Delphi的实现(正在进行开发)——。它是基于DCEF3库的,似乎有点左

它支持现成的代理设置界面。可以使用主浏览器对象的基本属性定义代理服务器、端口、用户名和密码


因此,如果使用TWebBrowser不一定是出于您的目的,您可以查看此组件。

FYI,您的第一个代码段是错误的。您正在声明一个未初始化的指针,它不指向任何东西。您需要改用它:
var IInfo:InternetProxyInfo;begin IInfo.dwAccessType:=INTERNET\u OPEN\u TYPE\u PROXY。。。UrlMkSetSessionOption(INTERNET_OPTION_PROXY,@IInfo,SizeOf(IInfo),0);结束雷米·勒博,没错。实际上,我忘了在这段代码中添加代码:New(PIInfo)。。。。。处置(PInfo);
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;