Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по функции InetIsOffline [D6, WinME]


Игорь ©   (2004-06-15 20:44:00) 

В Дайджест от 19.05.01 03:24 было выложено описание функии InetIsOffline:
******
Как проверить соединение с интернетом. (16.04.01 14:58)
Часто приложению, которое работает в интернете, требуется знать, подключён пользователь к интернету или нет. Предлагаю Вам довольно гибкое решение этого вопроса.
Совместимость: 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

Автор: Vitaly Zayko (zayko@vitsoftware.com)
Источник: http://www.sources.ru/delphi/

********

Попробовал в оффлайне. Результат: You are connected to Internet!
Подключился к Интернет. Результат: You are connected to Internet!

Далее попробовал заменить строку "if InetIsOffline(0) then" на "if not InetIsOffline(0)"

получилось все с точностью до наоборот:
в оффлайне: This computer is not connected to Internet!
в онлайне: This computer is not connected to Internet!

В чем смысл функции? Может кто объяснит?


Graber   (2004-06-18 01:37:00) [1]

Для проверки соединнения я использовал вот этот код. Функция проверяет наличие соединения с интернетом. Не дает информации о
действительной доступности сетевых ресурсов.
Для проверки доступности реурсов можно воспользоваться функцией CheckURL из
базы UBPFD или функцией CheckInetLink из базы UBPFD, которая выполняет обе
функции.
Функция возвращает
0 - если проверка показала отсутствие связи,
1 - если установлено модемное соединение,
2 - если установлено соединение через прокси.
Функция требует объявления типа в разделе interface модуля:
type ERasError = class(Exception);

function CheckInetConnect:byte;
const
 cERROR_BUFFER_TOO_SMALL = 603;
 cRAS_MaxEntryName = 256;
 cRAS_MaxDeviceName = 128;
 cRAS_MaxDeviceType = 16;
type
 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;

//---------------------------------------

function RasConnectionCount : Integer;
var
 RasDLL: HInst;
 Conns: array [1..4] of TRasConn;
 RasEnums: TRasEnumConnections;
 BufSize: DWord;
 NumConns: DWord;
 RasResult: Longint;
begin
Result:= 0;
// Загрузка библиотеки
RasDLL:= LoadLibrary('rasapi32.dll');
if RasDLL = 0 then exit;
try
 RasEnums:= GetProcAddress(RasDLL,'RasEnumConnectionsA');
 if @RasEnums = nil then
   raise ERasError.Create
    ('Ошибка вызова функции RasEnumConnectionsA из rasapi32.dll');
 Conns[1].dwSize:= Sizeof (Conns[1]);
 BufSize:= SizeOf(Conns);
 RasResult:= RasEnums(@Conns, BufSize, NumConns);
 If (RasResult = 0) or (Result = cERROR_BUFFER_TOO_SMALL) then
  Result:=NumConns;
finally
 FreeLibrary(RasDLL);
end;

end;

//---------------------------------------

var
 Reg : TRegistry;
 bUseProxy : Boolean;
 UseProxy : LongWord;

begin
Result:= 0;
Reg:= TRegistry.Create;
with REG do
try
 try
   RootKey:= HKEY_CURRENT_USER;
   if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet Settings',
    False) then begin
     // Пробуем прочитать и ловим ошибку
     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:= 2;
   end;
 except
   // Вероятно, нет связи через прокси
 end;
finally
Free;
end;
// Мы можем проверять(отмечать) RasConnectionCount, даже если работа с сетями
// телефонного вызова не установлена просто, потому что это возвратится 0,
// если DLL не найден.
if Result = 0 then
begin
 if RasConnectionCount > 0 then Result:= 1;
end;

end;

Удачи!!!


Cobalt   (2004-06-17 23:27:00) [2]

Такая вот мысль - при соединении с "интернетом" комп должени иметь реальный инетовский адрес (т.е. не адрес сети класса С).
Какие вообще есть методы подключения к "интернету":
1) Через прокси. Реальный Инет-адрес не требуется, т.к. его подставляет прокси-сервер. Но, полноценным соединением назвать это трудно, поскольку для соеджинения надо обязательно уметь работать через прокси.
2) Диалап, или VPN. Тут уже есть собственный сетевой интерфейс (надеюсь, ничего не напутал в терминологии?). Вот тут уже можно искать собственный "не локально-сетевой" адрес.

Что скажите?


Graber   (2004-06-17 02:21:00) [3]

Насколько я помню эта фцнкция коректно работает только под 98 Виновс.

Я тоде пытался определить подключение к интеренету и к меня не получалось даже под 98.

Можно использовать другой способ например попробовант зделать пинг на любой IP адрес или страничку


Наверх

Титульная страница Поиск, карта сайта Написать письмо