За это отвечает ф-ии InternetGetConnectedState() из wininet.dll или InetIsOffLine() из url.dll
Автор ответа:Song Взято с Vingrad.ru http://forum.vingrad.ru
Единственный 100% достоверный способ узнать находится ли комп в интернете это скачать что-то со стабильного внешнего сервера - такого как Microsoft, Yahoo, AT&T... По другому ни одна функция локального компьютера не сможет отличить нахождение компьютера в интранете и в интернете... Я в своей программе для определения коннекта с интернетом пингую наш собственный DNS сервер, который стоит за Firewall и естественно пинговка идет через провайдера интернет. (В некоторых Firewall может быть запрещен Ping - тогда надо именно попытаться скачать что-нибудь) Автор ответа:Vit Взято с Vingrad.ru http://forum.vingrad.ru
Часто приложению, которое работает в интернете, требуется знать, подключён пользователь к интернету или нет. Предлагаю Вам довольно гибкое решение этого вопроса.
Совместимость: Delphi 3.x (или выше)
Для работы Вам необходимо импортировать функцию InetIsOffline из URL.DLL:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external 'URL.DLL';
а затем поместить в программу простой вызов функции для проверки статуса соединения:
if InetIsOffline(0) then ShowMessage('This computer is not connected to Internet!') else ShowMessage(You are connected to Internet!');
Эта функция возвращает TRUE если соединение с интернетов отсутствует, или FALSE если соединение установлено.
Замечание: параметр Flag игнорируется, соответственно используем ноль. Эта DLL обычно проинсталлирована на большинстве компьютеров. Она также существует в Win98 либо поставляется с Internet Explorer 4 или выше, Office 97 и т.д.. Более подробно можно прочитать в MSDN. Оригинал: http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/InetIsOffline.htm
HRASConn = DWORD; PRASConn = ^TRASConn; TRASConn = record dwSize: DWORD; rasConn: HRASConn; szEntryName: array[0..cRAS_MaxEntryName] of Char; szDeviceType: array[0..cRAS_MaxDeviceType] of Char; szDeviceName: array [0..cRAS_MaxDeviceName] of Char; end;
TRasEnumConnections = function(RASConn: PrasConn; { buffer to receive Connections data } var BufSize: DWORD; { size in bytes of buffer } var Connections: DWORD { number of Connections written to buffer } ): Longint; stdcall; //End RasConnectionCount =======================
function ConnectedToInternet: TConnectionType; var Reg: TRegistry; bUseProxy: Boolean; UseProxy: LongWord; begin Result := ctNone; Reg := TRegistry.Create; with REG do try try RootKey := HKEY_CURRENT_USER; if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet settings', False) then begin //I just try to read it, and trap an exception if GetDataType('ProxyEnable') = rdBinary then ReadBinaryData('ProxyEnable', UseProxy, SizeOf(Longword)) else begin bUseProxy := ReadBool('ProxyEnable'); if bUseProxy then UseProxy := 1 else UseProxy := 0; end; if (UseProxy <> 0) and (ReadString('ProxyServer') <> '') then Result := ctProxy; end; except //Obviously not connected through a proxy end; finally Free; end;
//We can check RasConnectionCount even if dialup networking is not installed //simply because it will return 0 if the DLL is not found. if Result = ctNone then begin if RasConnectionCount > 0then Result := ctDialup; end; end;
function RasConnectionCount: Integer; var RasDLL: HInst; Conns: array[1..4] of TRasConn; RasEnums: TRasEnumConnections; BufSize: DWORD; NumConns: DWORD; RasResult: Longint; begin Result := 0;
//Load the RAS DLL RasDLL := LoadLibrary('rasapi32.dll'); if RasDLL = 0then Exit;
try RasEnums := GetProcAddress(RasDLL, 'RasEnumConnectionsA'); if @RasEnums = nilthen raise ERasError.Create('RasEnumConnectionsA not found in rasapi32.dll');