2010-01-06 56 views
9

Tôi có một ứng dụng Delphi giao tiếp với các máy chủ web trên Internet bằng cách sử dụng Indy components. Hầu hết người dùng của ứng dụng có kết nối Internet trực tiếp nhưng một số người đứng sau một máy chủ proxy của mạng cục bộ. Tôi không muốn phải yêu cầu người sử dụng để tra cứu máy chủ proxy của họ trong Internet Options/Connections/LAN Settings dialogLàm cách nào để ứng dụng Delphi phát hiện cài đặt proxy mạng của PC Windows?

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

như khá thẳng thắn hầu hết mọi người sẽ không biết hoặc quan tâm thiết lập này là gì.

Tôi có thể nhận thông tin này qua một số cuộc gọi hệ thống từ ứng dụng Delphi-7 không?

Rất cám ơn!

Trả lời

13

Via WinAPI - WinHttpGetIEProxyConfigForCurrentUser. Bạn phải yêu các tên WINAPI dài của MS^_ ^.

Sau OP sửa: Bạn có thể đọc từ registry, AFAIR nó sẽ được đặt ở đây:

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

+1 nhưng nếu tôi không nhầm, đó là chỉ dành cho IE. Firefox và các trình duyệt khác duy trì cài đặt Proxy của riêng chúng. –

+0

Đó là sự thật nhưng tôi giả định rằng nếu OP muốn để có được nó thông qua các cuộc gọi hệ thống, thì đó là những gì anh ta sau. –

+1

Cảm ơn bạn! Bây giờ tôi biết những gì để tìm kiếm, tôi tìm thấy một số mã ở đây: http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2004-01/0205.html – devstopfix

1

Bạn sẽ có để có được proxy thiết lập từ trình duyệt, mà có thể là tại các địa điểm khác nhau tùy thuộc vào trình duyệt đang sử dụng.

Bạn có thể cân nhắc xem Web Proxy Autodiscovery Protocol, tự động phát hiện cài đặt proxy trên mạng.

+0

Người dùng chắc chắn sẽ là bằng cách sử dụng IE :) nhưng cảm ơn cho liên kết! – devstopfix

2

Mã Delphi cho Kornel Kisielewicz 's answer:

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; 
+0

NB: TRegistry.ReadString(): "Nếu mục nhập Registry chứa một cái gì đó khác hơn là một chuỗi, một ngoại lệ được nâng lên." – devstopfix

3

Đây là một phương pháp mà tôi sử dụng, mà không yêu cầu truy xuất registry trực tiếp. Điều này làm việc theo D2007, nhưng tôi không thể thấy tại sao nó sẽ không hoạt động theo 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; 
+0

Nó sẽ là tốt để biết định nghĩa của chức năng SubStr của bạn, vì nó không phải là hoàn toàn rõ ràng ở đây. – mj2008

+1

@ mj2008: đó là tham chiếu đến một hàm trong đơn vị madStrings.pas từ thư viện xử lý ngoại lệ madExcept. Bạn có thể tìm thấy một số trợ giúp trực tuyến tại đây: http://help.madshi.net/StringSub.htm –

Các vấn đề liên quan