Detecção de conexão à internet 2: a missão

12/12/2003

2

Galerinha

É o seguinte: estava querendo fazer um programinha que detectasse conexão à internet em segundo plano. Nosso colega Francisco sugeriu o seguinte:
function TipoConexao:boolean; 
var flags: dword; 
begin 
Result := InternetGetConnectedState(@flags, 0); 
if Result then 
begin 
showmessage(´Conexão a Internet está Ativa´); 
if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then 
showmessage(´Conexão por modem´); 
if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then 
showmessage(´Conexião por lan´); 
if (flags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY then 
showmessage(´Conexião por proxy´); 
if (flags and INTERNET_CONNECTION_MODEM_BUSY) =INTERNET_CONNECTION_MODEM_BUSY then 
showmessage(´modem ocupado´); 
end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
TipoConexao; 
end; 

Acontece que mesmo se eu estiver off-line, o programa acusa o computador como conectado. O mesmo acontece qdo eu tento utilizar componentes como o TIdIPWatch.
Alguém, por favor, pode me explicar por que?
Desde já grato, sucesso a todos


Responder

Posts

12/12/2003

Fabio.hc

[b:9e757d108e]Como descobrir se você esta conectado com a Internet?[/b:9e757d108e]
1º) Você deve acrescentar um componente NMFTP (da paleta FastNet).
2º) Insira o seguinte código no evento OnShow do formulário.
If (NMFtp1.GetLocalAddress <> ´0,0,0,0´) Then 
   ShowMessage(´Você não está conectado!´) 
Else 
   ShowMessage(´Você está conectado!´);

3º) Execute o programa e veja o resultado.


Responder

12/12/2003

Tnaires

Olá Fábio

Muito obrigado pela atenção e pela ajuda!!! Mas eu já tentei 3 coisas:
- tentei usar esse componente q vc falou;
- tentei usar o método IsOnLine da classe TIdIPWatch (paleta Indy Miscellaneous);
- tentei usar a sugestão do Francisco

Mas eu simplesmente não entendo pq essas 3 tentativas indicaram meu computador como conectado, qdo na verdade eu estava desconectado.
E eu relanço a questão: Por quê?!
Sucesso a todos...


Responder

13/12/2003

Fabio.hc

Tente esta:

unit Unit4;

interface

uses
Windows, SysUtils, Registry, WinSock, WinInet;

type
   TConnectionType = (ctNone, ctProxy, ctDialup);

function ConnectedToInternet : TConnectionType; 
function RasConnectionCount : Integer; 
 
 
implementation 
 
const 
   cERROR_BUFFER_TOO_SMALL = 603;
   cRAS_MaxEntryName = 256;
   cRAS_MaxDeviceName = 128;
   cRAS_MaxDeviceType = 16;
type
   ERasError = class(Exception);

   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 para receber dados da conexao}
var BufSize: DWord; { tamanho em bytes do buffer }
var Connections: DWord { numero de conexoes escritas no buffer }
): LongInt; stdcall;


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
      //Nao conectado com proxy
      end;
   finally
      Free;
   end;

   if Result = ctNone then
      begin
      if RasConnectionCount > 0 then
         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 = 0 then
      exit;

   try
   RasEnums := GetProcAddress(RasDLL,´RasEnumConnectionsA´);
   if @RasEnums = nil then
      raise ERasError.Create(´RasEnumConnectionsA not found in 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;

end.



No Form:

procedure TForm1.Button1Click(Sender: TObject);
begin
   If (RasConnectionCount = 0) Then
      ShowMessage(´Você não está conectado!´)
   Else
      ShowMessage(´Você está conectado!´);
end;




Responder

14/12/2003

Tnaires

Olá Fábio

MUUUITO obrigado, funcionou muito bem!
Só tem uma anomalia... Qdo a ligação ainda está sendo efetuada (o computador não está de fato conectado, mas ainda discando) o programa afirma q ele está conectado. Mas não é problema, valeu mesmo pela solução!

Sucesso


Responder
No código que o fábio passou:
If (NMFtp1.GetLocalAddress <> ´0,0,0,0´) Then
ShowMessage(´Você não está conectado!´)
Else
ShowMessage(´Você está conectado!´);

Creio que o sinal de ´<>´ deveria ser trocado por ´=´

Naum to com o Delphi aqui aberto. Por isso naum tenho certeza.
Mas normalmente, quando o computador não está conectado, o IP dele é 0.0.0.0, e naum diferente!
Mas esse código soh deve funcionar uma vez, e ainda assim, quando o computador naum estiver na rede!
Depois de conectado (o IP soh muda depois de conectado, naum quando tah discando!), se cair a conexao, o codigo vai acusar o computador como conectado!

Eu acho!


Responder

09/01/2004

Tnaires

Olá Fausto
Eu havia notado esse problema qdo tentei usar a primeira sugestão do Fábio. Mas o problema é q o resultado dessa função aí, na minha máquina, retorna um IP diferente de 0.0.0.0, mesmo sem estar conectado à internet. No caso, é o IP q estava na conexão anterior. E é isso q eu não entendo, pois assim como vc, várias pessoas q eu perguntei afirmaram q o IP é nulo sem estar conectado.
Abraços


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira