一款 Delphi 应用程序如何检测 Windows 电脑的网络代理设置?

10
我有一个使用Indy组件与互联网上的Web服务器通信的Delphi应用程序。大多数应用程序用户都直接连接到互联网,但有些用户在本地网络的代理服务器后面。我不想让用户查找Internet Options / Connections / LAN Settings对话框中的代理服务器。

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

老实说,大多数人都不知道或不关心这个设置。我能否通过一些系统调用从Delphi-7应用程序获取此信息?
非常感谢!
4个回答

14

通过 WinAPI -- WinHttpGetIEProxyConfigForCurrentUser 可以获取。你得喜欢微软冗长的 WINAPI 名称 ^_^。

编辑后:你可以从注册表中读取,如果没记错的话应该在这里:

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

7
+1 但如果我没记错的话,那只适用于IE浏览器,而Firefox和其他浏览器会维护自己的代理设置。 - Pekka
没错,但我假设如果 OP 想通过系统调用获取它,那么这就是他想要的。 - Kornel Kisielewicz
1
谢谢!现在我知道要搜索什么了,我在这里找到了一些代码:http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2004-01/0205.html - devstopfix

4

Kornel Kisielewicz答案中的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;

NB:TRegistry.ReadString():“如果注册表条目包含的不是字符串,则会引发异常。” - devstopfix

3

这是我使用的另一种方法,不需要直接访问注册表。在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
1
@mj2008:这是指madExcept异常处理库中madStrings.pas单位中的函数引用。您可以在此处找到一些在线帮助:http://help.madshi.net/StringSub.htm - Conor Boyd

1

您需要从浏览器中获取代理设置,这可能因使用的浏览器而在几个不同的位置。

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


用户们肯定会使用IE :) 但还是谢谢提供链接! - devstopfix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接