AlainD
AlainD

Reputation: 6587

Check for internet access always returns true

The following code always returns True on my system:

uses
    WinInet;

function CheckInternetConnection() : Boolean;
var
    dwConnectionTypes: Integer;
begin
    dwConnectionTypes := (
        INTERNET_CONNECTION_MODEM +
        INTERNET_CONNECTION_LAN +
        INTERNET_CONNECTION_PROXY);     // "dwConnectionTypes" now "7"
    if (InternetGetConnectedState(@dwConnectionTypes, 0)) then
        Result := True      // Always hit, "dwConnectionTypes" now "18"
    else
        Result := False;    // Never reaches here!
end;

I've tried:

* unplugging the network cable
* stopped "Wireless Zero Configuration" service
* disabled all connections in Control Panel > Network Connections
* definitely confirmed no internet connection in a web browser

What am I missing?

UPDATE

I've confirmed that dynamically loading wininet.dll and using GetProcAddress to find the method "InternetGetConnectedState" gives exactly the same result with the internet disconnected (returns True and the parameter is set to "18").

Upvotes: 1

Views: 2388

Answers (1)

Jens Borrisholt
Jens Borrisholt

Reputation: 6402

If you want to know if you are connected to the Internet, there is no other way that contacting a host on the internet.

Correct technically then you only know if that host is online, but that's often good enough, since if your program requires internet access it's because you need to cantact a host on the internet.

One way of doing that is using a TIdHTTP from Indy:

uses
  IdHTTP;

uses IdHTTP;

function HasInternet: Boolean;
begin
  with TIdHTTP.Create(nil) do
    try
      try
        HandleRedirects := True;
        Result := Get('http://www.Google.com/') <> '';
      except
        Result := false;
      end;
    finally
      free;
    end;
end;

And then use it :

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := BoolToStr(HasInternet, True);
end;

But it would be bettet to try to contact you host.

Upvotes: 4

Related Questions