【问题标题】:How can a Delphi application detect the network proxy settings of a Windows PC?Delphi 应用程序如何检测 Windows PC 的网络代理设置?
【发布时间】:2011-01-02 02:19:58
【问题描述】:

我有一个 Delphi 应用程序,它使用 Indy components 与 Internet 上的 Web 服务器进行通信。该应用程序的大多数用户都有直接的 Internet 连接,但有些用户位于本地网络的代理服务器后面。我不想让用户在 Internet Options / Connections / LAN Settings dialog 中查找他们的代理服务器

alt text http://toybase.files.wordpress.com/2008/11/ie-proxy-settings.png

坦率地说,大多数人不会知道或关心这个设置是什么。

我可以通过 Delphi-7 应用程序中的一些系统调用获取此信息吗?

非常感谢!

【问题讨论】:

    标签: delphi proxy delphi-7


    【解决方案1】:

    通过 WinAPI -- WinHttpGetIEProxyConfigForCurrentUser。你一定会喜欢 MS 长长的 WINAPI 名称^_^。

    OP 编辑​​后:您可以从注册表中读取,AFAIR 将位于此处:

     [ HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings ]
    

    【讨论】:

    • +1 但如果我没记错的话,那仅适用于 IE。 Firefox 和其他浏览器维护自己的代理设置。
    • 确实如此,但我认为如果 OP 想要通过系统调用来获取它,那么这就是他所追求的。
    • 谢谢!现在我知道要搜索什么了,我在这里找到了一些代码:coding.derkeiler.com/Archive/Delphi/…
    【解决方案2】:

    您必须从浏览器获取代理设置,根据使用的浏览器,代理设置可能位于多个不同的位置。

    您可以考虑查看Web Proxy Autodiscovery Protocol,它会自动检测网络上的代理设置。

    【讨论】:

    • 用户肯定会使用 IE :) 但感谢您的链接!
    【解决方案3】:

    Kornel Kisielewiczanswer 的 Delphi 代码:

    uses Registry, Windows;
    
    function detectIEProxyServer() : string;
    begin
      with TRegistry.Create do
        try
            RootKey := HKEY_CURRENT_USER;
            if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet Settings', False) then begin
              Result := ReadString('ProxyServer');
              CloseKey;
            end
            else
              Result := '';
        finally
          Free;
        end;
    end;
    

    【讨论】:

    • 注:TRegistry.ReadString():“如果注册表项包含字符串以外的内容,则会引发异常。”
    【解决方案4】:

    这是我使用的另一种方法,它不需要直接访问注册表。这在 D2007 下有效,但我不明白为什么它在 D7 下无效。

    uses
      WinInet,
      SysUtils;
    
    function UseIEProxyInfo(var ProxyHost: String; var ProxyPort: Integer): Boolean;
    var
      ProxyInfo: PInternetProxyInfo;
      Len: LongWord;
      ProxyDetails: String;
      s2: String;
      i1: Integer;
    
      procedure RemoveProtocol(var str: string);
      var
        i1 : integer;
      begin
        i1 := PosText('://', str);
        if i1 > 0 then
          Delete(str, 1, i1 + 2);
        i1 := PosText('http=', str);
        if i1 > 0 then begin
          Delete(str, 1, i1 + 4);
          str := SubStr(str, 1, ' ');
        end;
      end;
    
    begin
      Result := False;
    
      Len := 4096;
      GetMem(ProxyInfo, Len);
      try
        if InternetQueryOption(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then
        begin
          if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then
          begin
            Result := True;
            ProxyDetails := ProxyInfo^.lpszProxy;
    
            RemoveProtocol(ProxyDetails);
            s2 := SubStr(ProxyDetails, 2, ':');
            if s2 <> '' then
            begin
              try
                i1 := StrToInt(s2);
              except
                i1 := -1;
              end;
    
              if i1 <> -1 then
              begin
                ProxyHost := SubStr(ProxyDetails, 1, ':');
                ProxyPort := i1;
              end;
            end;
          end;
        end;
      finally
        FreeMem(ProxyInfo);
      end;
    end;
    

    【讨论】:

    • 最好知道 SubStr 函数的定义,因为这里并不完全清楚。
    • @mj2008:它是对 madExcept 异常处理库中 madStrings.pas 单元中的函数的引用。你可以在这里找到一些在线帮助:help.madshi.net/StringSub.htm
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 2012-12-26
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多