如何测试计算机是否可以访问Internet?

时间:2014-02-23 17:00:13

标签: delphi networking database-connection delphi-7

我有一个在多个商店中使用的delphi程序。这些商店都连接到在线mysql数据库。在应用程序启动时,程序连接到数据库。当计算机未连接到互联网时,该程序正在冻结。我发现以下程序测试计算机是否连接到互联网:

public
function IsConnectedToInternet: Boolean;   

const
  INTERNET_CONNECTION_MODEM = 1;
  INTERNET_CONNECTION_LAN = 2;
  INTERNET_CONNECTION_PROXY = 4;
  INTERNET_CONNECTION_MODEM_BUSY = 8; 

implementation

function InternetGetConnectedState(lpdwFlags: LPDWORD;
dwReserved: DWORD): BOOL; stdcall; external 'WININET.DLL';

function TForm1.IsConnectedToInternet: Boolean;
var
dwConnectionTypes: Integer;
begin
  try
    dwConnectionTypes := INTERNET_CONNECTION_MODEM +
    INTERNET_CONNECTION_LAN +
    INTERNET_CONNECTION_PROXY;

    if InternetGetConnectedState(@dwConnectionTypes, 0) then
      Result := true
    else
      Result := false;
  except
    Result := false;
  end;
end;

procedure Tform1.FormCreate(Sender: TObject);
begin
  If IsConnectedToInternet then
    MysqlConnection.Connect;
end;

如果计算机连接 wifi 等,这可以正常测试。但它不会测试此连接是否具有互联网访问权限。例如,如果计算机连接到限制为10GB的wifi,并且当10gb用完时,计算机仍将连接到wifi,但无法访问互联网。

在这种情况下,上面的函数将给出 true 的结果,使程序尝试连接,这将使程序冻结。

如何解决此错误?是否有测试计算机是否具有互联网访问权限的程序?

2 个答案:

答案 0 :(得分:2)

检查连接的唯一可靠方法是尝试连接。这样做可能会阻止尝试连接的线程。然后,逻辑结论是,要阻止UI线程被阻止,您必须从UI线程以外的线程进行连接。

答案 1 :(得分:0)

在您的使用中添加单位“WinNet”。使用“InternetGetConnectedState”函数返回Internet状态和类型的值。见下文:

    function YourFunctionName : boolean;
  var
     origin : cardinal;
  begin
     result := InternetGetConnectedState(@origin,0);

     //connections origins by origin value
     //NO INTERNET CONNECTION              = 0;
     //INTERNET_CONNECTION_MODEM           = 1;
     //INTERNET_CONNECTION_LAN             = 2;
     //INTERNET_CONNECTION_PROXY           = 4;
     //INTERNET_CONNECTION_MODEM_BUSY      = 8;
  end;